2010-02-06 60 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