当前位置: 首页 > 知识库问答 >
问题:

要检查的异常被捕获,但未声明的异常被捕获

韩单弓
2023-03-14

我的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类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时

Java文档是这样说的。rmi。意外情况:

如果远程方法调用的客户端由于调用而接收到不在远程接口中方法的throws子句中声明的已检查异常类型中的已检查异常,则会引发意外异常。

但我的远程接口指定foo()抛出异常,而java。伊奥。InterruptedIOException是一种异常。那么为什么我的客户会得到意想不到的例外呢?

谢谢,汤姆

共有2个答案

宋弘壮
2023-03-14

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

路伟
2023-03-14

但我的远程接口指定foo()抛出异常,而java。伊奥。InterruptedIOException是一种异常。那么为什么我的客户会得到意想不到的惊喜呢

因为

throws Exception 

意味着该方法可以抛出类类型异常或其任何子类类型的异常InterruptedOExceptionException的一个子类,因此当签名中提到其超级类型Exception时,抛出InterruptedOException的方法是完全有效的。

 类似资料:
  • 问题内容: 我尝试编译以下内容,但在m16h(x)周围得到以下内容: 不知道为什么。我已经尝试过各种方法,但是看来我做得对。 问题答案: 方法的签名表明很容易引发Exception。 这意味着异常之一: 必须由呼叫者处理 } catch (Exception e) { e.printStackTrace(); } 必须由呼叫者重新抛出

  • 我在Eclipse中尝试Apache HTTP客户端库 下面的代码片段检查了异常并需要处理。 日蚀给出了3条建议 > Add throws Exception-(工作正常) 用尝试捕捉包围- (也工作正常) 用try/multicatch环绕 第三个选项给出错误 客户端协议异常已经被替代的IO异常捕获 我看到了的源代码,它。据我所知,在捕获多个异常时,我们可以在更具体的异常下捕获更一般的异常。因此

  • 问题 你在一个 except 块中捕获了一个异常,现在想重新抛出它。 解决方案 简单的使用一个单独的 rasie 语句即可,例如: >>> def example(): ... try: ... int('N/A') ... except ValueError: ... print("Didn't work") ...

  • 我用的是spring-boot和JPA。我试图捕捉未检查的异常,如(违反约束)引发的事务。即使我添加了catch块,它也会在超出事务边界时抛出。 我谷歌了一下,发现可以通过事务回调来实现。我尝试了下面的代码:仍然是给出错误 请帮帮我!!

  • 问题内容: 在Java中,引发 检查 异常(Exception或其子类型- IOException,InterruptedException等)的方法必须声明 throws 语句: 不声明语句的 方法不能 引发检查的异常。 但是在Java中使用安全方法捕获检查的异常仍然合法: 其实没有 有点可笑:编译器知道 e 不是检查的异常,因此可以将其重新抛出。事情甚至有些荒谬,此代码无法编译: 第一个片段是

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们