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

java-'throws'子句中的异常不是从正文中抛出的

汪栋
2023-03-14
public class MyClass {

    public void foo() throws IOException {
        System.out.println("Hola");
    }

    public MyClass() throws IOException {

    }

}

正如您所看到的,我正在方法和构造函数的throws子句中声明IOException。但我不会在身体的任何地方抛出这个例外。因此,它应该是一个编译时错误,就像我们试图捕获不是从try块抛出的异常一样。但在这种情况下,它编译得很好。有人能解释一下这种行为背后的原因吗?

共有1个答案

谢涵煦
2023-03-14

声明抛出IOException并不要求实际抛出异常。

如果是这种情况,那么就不可能编程,因为方法的所有分支都需要抛出异常(即使在非异常情况下)。

这更多的是一个拥有完整契约的问题,在该契约中,调用方能够处理可能的异常。这就适应了将来可能被迫实际抛出异常的实现。
允许重写的方法省略检查的异常(不强制您抛出它)可能是出于同样的原因

 类似资料:
  • 我已经看到过一个类似的问题,但是我还没有找到一个解决方案,因为在我的例子中,放入try子句的函数实际上会引发一个异常。 在my try块中,psv main调用方法,该方法打印2并引发名为myexc3的异常。然后,这个异常应该由处理,它应该打印3等等。但代码实际上并不编译: 异常MyExc3从不在相应try语句的正文中抛出 这是为什么?

  • 我不是太笨,不会意识到“try catch”中的代码不能抛出异常。但是我被困在这里,因为我完全从书中复制了代码,所以它在出版时肯定是正确的。这让我想知道代码是否不能再编译了,因为它已经过时了?我意识到这个问题的性质可能会冒犯在座的一些人。如果是的话,请不要在严厉的斥责中过于严厉。 我得到了一个错误: ./streamcopier.java:13:错误:异常IOException从不在相应try语句

  • 在我更好地学习Java的过程中,我一直试图理解异常处理。我不明白为什么下面的代码不能编译。 编译器消息为:

  • 问题内容: 谁能告诉我异常产生的原因有哪些,与“ throws”子句不兼容 例如: 异常异常与Super.foo()中的throws子句不兼容 问题答案: 没有完整的代码示例,我只能猜测:您正在重写/实现子类中的方法,但是子类方法的异常规范与父类/接口方法的异常规范不兼容(即,不是其子集)? 如果声明基本方法根本不抛出异常,或者例如(这是您的方法的子类正在尝试在此处抛出),则可能发生这种情况。基类

  • 问题内容: 在下面的源代码中,我抛出一个。 为什么没有必要将关键字放在方法的签名上? 问题答案: 仅在Java 1.7上会出现此现象。使用1.6进行编译时,出现以下编译器错误消息: 但是,使用Java 1.7可以编译。 …直到我实际把一个块扔了进去: 编译中… 看起来Java 1.7足够聪明,可以通过分析块代码来检测可能抛出的类型,而1.6刚看到类型并为此给出了错误。 对其进行更改以使其按预期方式