Java RMI - 注册表绑定调用导致NoSuchObjectException

时间:2013-12-07 14:51:34

标签: java exception rmi

我有一个简单的程序,可以使calcPi()可以通过Java-RMI, 当我启动程序时,我得到了这个例外:

java.rmi.NoSuchObjectException: no such object in table
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at server.CalculatePi.main(CalculatePi.java:24)

这是我的代码,在界面下方:

public class CalculatePi implements ICalculatePi {
    @Override
    public Double calcPi() throws RemoteException{
    return 3.141259;
}

public static void main(String[]args){
    if(System.getSecurityManager()==null){
        System.setProperty("security.policy","file:./security.policy");
    }
    try{

        String name="Pi-Rechner";
        ICalculatePi rechner=new CalculatePi();
        ICalculatePi stub=(ICalculatePi) UnicastRemoteObject.exportObject(rechner, 0);
        Registry myRegistry=LocateRegistry.getRegistry();
        myRegistry.rebind(name,stub);
        System.out.println("Rechner gebunden!");
    }catch(Exception e){
        e.printStackTrace();
    }
}

}

这是我的界面:

package server;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ICalculatePi extends Remote {
    public Double calcPi() throws RemoteException;
}

我在编程时遵循了教程:http://docs.oracle.com/javase/tutorial/rmi/implementing.html

如果有人得到了一个简单易用的解决方案,那就谢谢了!

1 个答案:

答案 0 :(得分:1)

您的系统上运行了另一个RMI进程,在端口1099上导出,但它不是RMI注册表。找到该进程,将其删除,然后运行RMI注册表(通常是rmiregistry命令)。