我有一个简单的程序,可以使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
如果有人得到了一个简单易用的解决方案,那就谢谢了!
答案 0 :(得分:1)
您的系统上运行了另一个RMI进程,在端口1099上导出,但它不是RMI注册表。找到该进程,将其删除,然后运行RMI注册表(通常是rmiregistry
命令)。