我的RMI服务器接口声明了一个方法foo(),它被声明为抛出RemoteException和Exception,如下所示:
public interface Node extends RemoteService {
public void foo() throws RemoteException, Exception;
}
服务器实现是:
public class NodeImpl extends UnicastRemoteObject implements Node {
public void foo() throws RemoteException, Exception {
// Implementation - calls other stuff...
}
}
我的客户端在服务器上调用foo:
try {
node.foo();
}
catch (Exception e) {
System.err.print("Got exception from foo() of type " + e.getClass().getName());
System.err.println("Exception: " + e.getMessage());
}
现在,当我运行客户端时,我得到了:
从java.rmi.UnexpectedException类型的foo()获得异常 例外:未声明的已检查异常;嵌套异常是: java.io.InterruptedIOException:操作超时
Java doc说这是关于java.rmi.UnexpectedException:
如果远程方法调用的客户端,则抛出UnexpectedException 作为调用的结果,接收不是的已检查异常 在throws子句中声明的已检查异常类型中 远程接口中的方法。
但我的远程接口指定foo()抛出异常,而java.io.InterruptedIOException是一种异常。那么为什么我的客户端会出现UnexpectedException?
谢谢, 汤姆
答案 0 :(得分:2)
但我的远程接口指定foo()抛出异常,并且 java.io.InterruptedIOException是一种异常。那我为什么呢? 客户端获取UnexpectedException
由于
throws Exception
表示该方法可以抛出类类型Exception
或其任何子类类型的异常。 InterruptedIOException
是Exception
的子类,因此在签名时抛出InterruptedIOException
的方法完全有效,其中提到了超级类型Exception
。
答案 1 :(得分:0)
我强烈怀疑您没有在客户端和服务器上运行相同版本的代码。做一个干净的构建并重新部署一切。服务器和客户端的远程接口之间似乎存在分歧。