客户端获得未声明的检查异常,但声明异常被捕获

时间:2014-06-20 00:15:07

标签: java rmi

我的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?

谢谢, 汤姆

2 个答案:

答案 0 :(得分:2)

  

但我的远程接口指定foo()抛出异常,并且   java.io.InterruptedIOException是一种异常。那我为什么呢?   客户端获取UnexpectedException

由于

throws Exception 

表示该方法可以抛出类类型Exception或其任何子类类型的异常。 InterruptedIOExceptionException的子类,因此在签名时抛出InterruptedIOException的方法完全有效,其中提到了超级类型Exception

答案 1 :(得分:0)

我强烈怀疑您没有在客户端和服务器上运行相同版本的代码。做一个干净的构建并重新部署一切。服务器和客户端的远程接口之间似乎存在分歧。