在弄脏 RMI 时,我遇到了一个java.rmi.NoSuchObjectException
异常,这导致我提出了这个问题:java.rmi.NoSuchObjectException: no such object in table but my question is different。
我在我的 main 方法中创建 impl 对象,因此在主线程中。如果我这样做:
FooImpl fi = new FooImpl();
foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);
一切正常。
如果我这样做:
foo = (Foo) UnicastRemoteObject.exportObject(new FooImpl(), 0);
我看到收集了 FooImpl 实例,然后我得到了上述异常。
foo
是我在 main 中初始化的静态引用;另一个远程对象foo
从其方法之一返回。因此,客户端首先获取该远程对象,然后从中获取foo
,然后调用一个方法foo
,这就是我得到上述异常的时候。那么为什么会这样呢?
编辑:这是我的主要方法
public static void main(String[] args) throws RemoteException, AlreadyBoundException
{
Server server = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(server, 0);
FooImpl fi = new FooImpl();
foo = (Foo) UnicastRemoteObject.exportObject(fi, 0);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.out.println("Server ready!");
}
在客户端,我正在获取hello
并调用一个方法,它给了我foo
,然后调用一个方法foo
。
EDIT2:如果我使用
Hello stub = (Hello) UnicastRemoteObject.exportObject(new Server(), 0);
foo
然后先绑定hello
,然后当我尝试访问时抛出相同的异常,hello
因为现在它是正在收集的服务器实例。真是奇怪的东西!