首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的非法远程方法

java中的非法远程方法
EN

Stack Overflow用户
提问于 2011-01-10 18:35:41
回答 1查看 28K关注 0票数 49

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

jvm声称遇到了一个非法的远程方法,但是这个方法及其实现对我来说似乎很好。

除了错误地实现或调用方法之外,是否还有其他原因导致此异常发生?

下面是堆栈跟踪:

代码语言:javascript
复制
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

下面是界面:

代码语言:javascript
复制
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();
}

下面是类的构造函数:

代码语言:javascript
复制
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();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-10 19:26:06

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

代码语言:javascript
复制
public String getId() throws RemoteException;

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

另外,getLeafNodes()getNeighborhoodList()方法应该有指定Node的返回类型,而不是NodeImpl,否则它们可能也会失败。

票数 88
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4650161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档