为什么覆盖方法会抛出任何未经检查的异常?

时间:2015-07-05 07:39:31

标签: java inheritance exception-handling

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

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

2 个答案:

答案 0 :(得分:3)

假设一个基类有以下方法:

int foo() throws IOException;

这意味着该方法可以

  • 返回一个int
  • 抛出已检查的IOException
  • 抛出它想要的任何运行时异常,因为不需要在throws子句中声明运行时异常

现在让我们在子类中重写此方法。子类必须遵守基本方法的约定,因此它可以

  • 返回一个int
  • 抛出已检查的IOException
  • 抛出它想要的任何运行时异常:这不会违反基本方法的合同。

但它无法做到的是

  • 返回double,对象或除int之外的任何内容,因为这会违反基本方法的约定
  • 抛出另一个已检查的异常,因为这会违反基本方法的合同

答案 1 :(得分:1)

  

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

Java中的任何方法都可以抛出未经检查的异常。覆盖方法也是一种方法,因此在未经检查的异常时,它获得与其他方法相同的权限。

  

我只是想知道为什么Overriding方法可以取消选中   异常虽然不能抛出检查异常

你的句子的最后一部分是不正确的。最重要的方法可以抛出两者检查未经检查的异常。我相信你要问的问题是

  1. 为什么 CAN' T 覆盖方法在覆盖方法没有时抛出已检查的异常。
  2. 为什么 CAN 重写方法会在重写方法不存在时抛出未经检查的异常。
  3. 让我们回答1)

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

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

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

    如果对overriden方法抛出的检查异常没有限制,则上述代码中不会出现编译错误。编译器不知道doSomething中的Child实际上可以throw检查Exceptionthrow ExceptiondoSomething方法的Child子句有点毫无意义,因为程序员不需要处理已检查的异常。

    让我们回答2)

    Oracle tutorial有一个很好的写作,在你的问题的上下文中很有用:

      

    运行时异常表示由a产生的问题   编程问题,因此,API客户端代码不能   合理地预计会从他们身上恢复或处理它们   办法。这些问题包括算术异常,例如除以   零;指针异常,例如尝试通过a访问对象   空引用;和索引异常,例如尝试访问   通过索引太大或太小的数组元素。

         

    运行时异常可以发生在程序的任何地方,也可以是典型的   一个他们可以很多。必须添加运行时异常   每个方法声明都会降低程序的清晰度。就这样   编译器不要求您捕获或指定运行时异常   (虽然你可以)。

    由于程序员没有义务捕获方法抛出的RuntimeException,因此在重写方法的情况下对未经检查的异常设置相同的限制是没有意义的。