为什么重写方法可以在java中抛出未经检查的异常?
为什么重写方法不能抛出比重写方法更广泛的异常?这不是我的问题。我只是想知道为什么重写方法可以抛出未检查的异常,而不能抛出已检查的异常。
为什么重写方法可以在java中抛出未经检查的异常?
Java中的任何方法都可以引发未经检查的异常。重写方法也是一种方法,因此在遇到未检查的异常时,它可以获得与其他方法相同的权限。
我只是想知道为什么重写方法可以抛出未检查的异常,而不能抛出已检查的异常
你句子的最后一部分不正确。重写方法可以抛出已检查和未检查的异常。我相信你想问的问题是
让我们来回答1)
class Parent {
public void doSomething() { }
}
class Child extends Parent {
public void doSomething()throws Exception { }
}
假设上面的代码是允许的。客户端代码将如下所示:
Parent p = new Child();
p.doSomething();
如果对覆盖方法可以抛出哪些检查过的异常没有限制,则上述代码中就不会出现编译错误。编译器不知道UNICEF
中的do某事
实际上可以抛出
一个检查过的Exception
。UNICEF
中doThings
方法的抛出异常
子句将有点毫无意义,因为程序员不需要处理检查过的异常。
让我们回答2)
Oracle教程有一篇很好的总结,对你的问题很有用:
运行时异常表示编程问题导致的问题,因此,不能合理地期望API客户机代码从中恢复或以任何方式处理它们。这类问题包括算术上的例外,比如除以零;指针异常,例如试图通过空引用访问对象;以及索引异常,例如试图通过太大或太小的索引访问数组元素。
运行时异常可以发生在程序中的任何地方,在一个典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不需要捕捉或指定运行时异常(尽管可以)。
由于程序员没有义务捕获方法引发的运行时异常
,因此在重写方法的情况下,对未检查的异常设置与检查的异常相同的限制是毫无意义的。
假设基类具有以下方法:
int foo() throws IOException;
这意味着该方法可以
现在让我们在一个子类中重写这个方法。子类必须遵守基本方法的约定,这样才能
但它不能做的是
所以我必须做以下其中之一: 在每个doSomething调用周围添加try catch块 在main中添加throws语句 删除doSomething中的throws语句 将该条件作为前提条件,这样不遵循该条件就会导致未定义的行为或类似的行为。 3将不起作用,因为doSomething可能会在客户端使用时引发异常。1和2简直是多余的,我认为应该避免。 我的问题是:在提到的选项(或任何其他选项)中,
问题内容: 我有一些具有这种结构的代码: 我有很多方法在catch块中具有相同的代码,因此我想将其提取到一种方法中,以便节省一些行。我的问题是,如果这样做,则会收到编译器错误“本地变量o可能尚未初始化”。 有什么解决方法吗? 问题答案: 您需要先初始化局部变量,然后才能按如下方式使用它们 除非使用未初始化的局部变量,否则编译失败
根据JCIP第6.3.2节: Runnable是一个相当有限的抽象;run无法返回值或引发选中的异常。 无法返回值,因为其返回类型为void,但为什么不能引发选中的异常?
问题内容: 我想知道为什么spring只处理未检查的异常.....谁能解释这背后的原因是什么。 Spring使用的任何设计模式都可以避免检查异常? 问题答案: Spring使用的任何设计模式都可以避免检查异常? 不是设计模式,而是 异常处理的最佳实践 。 考虑下面的代码: 上面的代码有什么问题? 引发异常后,将暂停正常程序执行,并将控制权转移到catch块。catch块捕获异常并抑制它。在catc
问题内容: 通常,如果有任何类extends ,它将成为检查异常。还扩展了Exception。那么它是如何? 难道他们在这种特殊情况下会在 编译器中 自定义检查? 编辑: 我对已 检查的v / s未检查的异常 以及它们的优缺点等有适当的了解。我不接受它们之间的区别。 问题答案: 在规范的第11.1.1节中有明确规定: 及其所有子类共同是 运行时异常类 。 在 未经检查的异常类 是运行时异常类和错误
假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。