2010-02-06 78 views
0

對於學校我們用RMI製作了一個Java應用程序,有3個應用程序:Server,Client和Rekenaar。JAVA RMI dispatchUncaughtException - 接口投射問題

出錯的行是行:「test =(Range [])m.getAllRange();」,它給出了dispatchUncaughtException。

package rekenaar; 

import server.Opdracht; 
import java.rmi.Naming; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import interfaces.*; 
import java.rmi.RemoteException; 

/** 
* 
* @author Windows 
*/ 
public class Rekenaar implements Runnable{ 

    private Range range; 
    private IRekenCoördinator coordinator; 
    private long[] priemgetallen; 
    private Opdracht op; 
    private Range[] test; 

    public Rekenaar() 
    { 
     try{ 
     this.coordinator = null; 
     this.coordinator = (IRekenCoördinator) Naming.lookup("rmi://127.0.0.1:1099/RekenC"); 
     this.priemgetallen = coordinator.getPriemgetallen(); 
     this.op = null; 
     }catch(Exception ex){ex.printStackTrace();} 

    } 


    public void Bereken() 
    { 
     try{ 
     long rangeOndergrens = (op.getGetal()/2000) * 2000; 
     range = new Range(priemgetallen, rangeOndergrens); 
     op.setRange(range); 
     op.setUitkomst(range.geefSemiPriem(op.getGetal())); 
     coordinator.RemoveID(op.CheckRange()); 

     IMagazijn m = op.getMagazijn(); 
     test = (Range[])m.getAllRange(); 
     String hoi = m.hoi(); 


     m.AddRange(op); 
     }catch(RemoteException ex){ex.printStackTrace();} 
    } 


    @Override 
    public void run() { 
       KrijgtOpdracht(); 
    } 

    private void KrijgtOpdracht() 
    { 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Rekenaar.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     if(coordinator != null) 
     { 
      try{ 
     op = (Opdracht)coordinator.getOpdracht(); 
      } 
      catch (Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
     if(op != null) this.Bereken(); 

     this.run(); 

     } 
    } 

} 

接口:

package interfaces; 

import java.io.IOException; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 

/** 
* 
* @author Windows 
*/ 
public interface IMagazijn extends Remote { 

    /** 
    * 
    * @param op  Uitgerekende opdracht waarvan de gegevens verwerkt moeten worden op de server 
    * @throws IOException 
    */ 
    public String hoi() throws RemoteException; 
    public IRange[] getAllRange() throws RemoteException; 
    public void AddRange(IOpdracht op) throws RemoteException; 

} 

這裏是Magazijn本身這給IRange通過RMI:

package server; 


import java.rmi.RemoteException; 
import java.util.ArrayList; 

import interfaces.*; 
import java.rmi.server.UnicastRemoteObject; 



public class Magazijn extends UnicastRemoteObject implements IMagazijn{ 

private IRange[] ranges; 
private long ondergrens; 

public void setOndergrens(long ondergrens) { 
    this.ondergrens = ondergrens; 
} 
private long bovengrens; 

public void setBovengrens(long bovengrens) { 
    this.bovengrens = bovengrens; 
} 
private transient MagazijnManager MM; 
private transient ArrayList<Opdracht> dubbeleOpdrachten; 
private transient RekenCoördinator RC; 
private transient int MAGAZIJN_GROOTTE; 

public Magazijn(long ondergrens, long bovengrens, MagazijnManager mm, RekenCoördinator RC)throws RemoteException 
{ 
    ranges = new IRange[(int)(bovengrens-ondergrens)/2000]; 
    this.bovengrens = bovengrens; 
    this.ondergrens = ondergrens; 
    dubbeleOpdrachten = new ArrayList<Opdracht>(); 
    this.MM = mm; 
    this.RC = RC; 
    MAGAZIJN_GROOTTE = (int)(bovengrens - ondergrens) + 1; 
} 

public void AddRange(IOpdracht op) throws RemoteException 
{ 
    ArrayList<IOpdracht> returnList = new ArrayList<IOpdracht>(); 
    ranges[op.getRangeIndex()] = op.getRange(); 
    returnList.add(op); 
    for(Opdracht o : dubbeleOpdrachten) 
    { 
     if(o.getRangeIndex() == op.getRangeIndex()) 
     { 
      o.setRange(op.getRange()); 
      o.setUitkomst(o.getRange().geefSemiPriem(o.getGetal())); 
      returnList.add(o); 
     } 
    } 
    MM.StuurOpdrachtenTerug(returnList); 
} 

public IRange[] getAllRange() throws RemoteException 
{ 
    return ranges; 
} 

public String hoi() throws RemoteException 
{ 
    return "poep"; 
} 

public IRange getRange(int rangeIndex) 
{ 
    return ranges[rangeIndex]; 
} 

public void StuurOpdracht(Opdracht op) 
{ 
    Opdracht o =null; 
     o = RC.AddOpdracht(op); 
    if(o!=null) 
    { 
     dubbeleOpdrachten.add(o); 
    } 
} 

public long getOndergrens() 
{ 
    return ondergrens; 
} 

public long getBovengrens() 
{ 
    return bovengrens; 
} 

public int getMagazijnGrootte() 
{ 
    return MAGAZIJN_GROOTTE; 
} 

} 

的Rekenaar得到了全班 「範圍」,這樣是不是問題。問題是在將愛爾蘭鑄造到範圍之間。範圍本身是可串行化的,並實現了IRange。

我得到的錯誤:線程「main」中的異常java.lang.ClassCastException:[Linterfaces.IRange;不能投射到[Lrekenaar.Range;

回答

2

當使用RMI時,您將不會收到與服務器端相同的實現。相反,你會得到一個代理類,它會調用你的服務器。所以你不能施展你的方法。 更改測試到

IRange[] test 

應該這樣做。

+0

你說了什麼,在此之後,沒有例外。測試還有一個長度(49),但所有的值都是「無效的」。對此有了一個想法?也許IRange的界面應該包含更多關於Range的信息? – Julian 2010-02-06 14:55:55

+0

另外,當我看「測試」,他說測試是否類型:「IRange []」和長度是49.但是,當我打開數組,他得到的名稱[0]至[48],但沒有得到* * type **,值爲** null **。我認爲這是一個問題? – Julian 2010-02-06 15:07:30

+0

您可以添加Range和IRange的代碼嗎? – Julian 2010-02-06 15:11:30