在java中非法的远程方法

这是我第一次使用Java Rmi *。 我有一个扩展UnicastRemoteObject的自定义类,实现了一个扩展远程的接口。 我认为我已经在类中正确地实现了接口的方法,但是当我尝试运行我的代码(并且它是关于一个没有参数的方法)时,我仍然得到IllegalArgumentException

jvm声称遇到了非法的远程方法,但方法和它的实现对我来说似乎很好。

除了错误地执行或调用方法之外,是否还有其他原因可能导致发生此exception?


这是堆栈跟踪:

 SEVERE: null java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at NodeImpl.<init>(NodeImpl.java:30) at NodeLauncher.main(NodeLauncher.java:11) Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.Util.checkMethod(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.createProxy(Unknown Source) ... 7 more 

界面如下:

 import java.rmi.*; import java.util.LinkedList; interface Node extends Remote { public boolean isAlive(); public LinkedList<NodeImpl> getLeafNodes(); public LinkedList<NodeImpl> getNeighborhoodList(); public String [] getRoutingTable(); public NodeImpl initiation(String credentials,Object application); public String route(String message,String key); public void inform(byte [] id); public String getId(); public boolean isConnected(); public void applicationClose(); public boolean distanceMeasure(); } 

这里是这个类的构造函数:

 public NodeImpl() throws RemoteException { super(); l=4; M=1; nodeId=new byte [16]; Random r=new Random(); r.nextBytes(nodeId); leafNodes=new LinkedList<NodeImpl>(); connected=false; ng=new NodeGUI(this); for(int i=0;i<l;i++) { leafNodes.add(null); } neighborhoodList=new LinkedList<NodeImpl>(); anyNodeWhoAnswered=new LinkedList<byte []>(); it=new InformingTimer(this); Thread informingTimerThread=new Thread(it); informingTimerThread.start(); try { Naming.rebind("rmi://" + "localhost" + ":1099/"+nodeId, this); } catch (Exception ex) { Logger.getLogger(NodeImpl.class.getName()).log(Level.SEVERE, null, ex); } bootstrap(); } 

RMI Remote接口上的所有方法都必须在throws子句中声明RemoteException ,例如:

 public String getId() throws RemoteException; 

不清楚为什么exception名称是getId() ,这可能只是它检查的第一个方法。

此外, getLeafNodes()getNeighborhoodList()方法应具有指定Node返回types,而不是NodeImpl ,否则它们可能也会失败。