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

为什么重写方法可以抛出任何未经检查的异常?

商高谊
2023-03-14

为什么重写方法可以在java中抛出未经检查的异常?

为什么重写方法不能抛出比重写方法更广泛的异常?这不是我的问题。我只是想知道为什么重写方法可以抛出未检查的异常,而不能抛出已检查的异常。

共有2个答案

卫逸春
2023-03-14

为什么重写方法可以在java中抛出未经检查的异常?

Java中的任何方法都可以引发未经检查的异常。重写方法也是一种方法,因此在遇到未检查的异常时,它可以获得与其他方法相同的权限。

我只是想知道为什么重写方法可以抛出未检查的异常,而不能抛出已检查的异常

你句子的最后一部分不正确。重写方法可以抛出已检查和未检查的异常。我相信你想问的问题是

  1. 为什么重写方法不能抛出选中的异常,而被重写的方法却不能抛出选中的异常。
  2. 为什么重写方法不能引发未经检查的异常,而重写方法却不能

让我们来回答1)

   class Parent {
      public void doSomething() { }
   }

   class Child extends Parent {
      public void doSomething()throws Exception { }
   }

假设上面的代码是允许的。客户端代码将如下所示:

   Parent p = new Child();
   p.doSomething(); 

如果对覆盖方法可以抛出哪些检查过的异常没有限制,则上述代码中就不会出现编译错误。编译器不知道UNICEF中的do某事实际上可以抛出一个检查过的ExceptionUNICEFdoThings方法的抛出异常子句将有点毫无意义,因为程序员不需要处理检查过的异常。

让我们回答2)

Oracle教程有一篇很好的总结,对你的问题很有用:

运行时异常表示编程问题导致的问题,因此,不能合理地期望API客户机代码从中恢复或以任何方式处理它们。这类问题包括算术上的例外,比如除以零;指针异常,例如试图通过空引用访问对象;以及索引异常,例如试图通过太大或太小的索引访问数组元素。

运行时异常可以发生在程序中的任何地方,在一个典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不需要捕捉或指定运行时异常(尽管可以)。

由于程序员没有义务捕获方法引发的运行时异常,因此在重写方法的情况下,对未检查的异常设置与检查的异常相同的限制是毫无意义的。

司徒经纶
2023-03-14

假设基类具有以下方法:

int foo() throws IOException;

这意味着该方法可以

  • 返回整数

现在让我们在一个子类中重写这个方法。子类必须遵守基本方法的约定,这样才能

  • 返回整数

但它不能做的是

  • 返回双精度、对象或int以外的任何东西,因为这会违反base方法的约定
  • 抛出另一个已检查的异常,因为这将违反基本方法的契约
 类似资料:
  • 所以我必须做以下其中之一: 在每个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的解决方案。