为什么重写方法会在java中抛出未经检查的异常?
为什么不能覆盖方法抛出比重写方法更广泛的异常?不是我的问题。 我只是想知道为什么Overriding方法可以抛出未经检查的异常而不能抛出已检查的异常。
答案 0 :(得分:3)
假设一个基类有以下方法:
int foo() throws IOException;
这意味着该方法可以
现在让我们在子类中重写此方法。子类必须遵守基本方法的约定,因此它可以
但它无法做到的是
答案 1 :(得分:1)
为什么重写方法会在java中抛出未经检查的异常?
Java中的任何方法都可以抛出未经检查的异常。覆盖方法也是一种方法,因此在未经检查的异常时,它获得与其他方法相同的权限。
我只是想知道为什么Overriding方法可以取消选中 异常虽然不能抛出检查异常
你的句子的最后一部分是不正确的。最重要的方法可以抛出两者检查未经检查的异常。我相信你要问的问题是
让我们回答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
检查Exception
。 throw Exception
中doSomething
方法的Child
子句有点毫无意义,因为程序员不需要处理已检查的异常。
让我们回答2)
Oracle tutorial有一个很好的写作,在你的问题的上下文中很有用:
运行时异常表示由a产生的问题 编程问题,因此,API客户端代码不能 合理地预计会从他们身上恢复或处理它们 办法。这些问题包括算术异常,例如除以 零;指针异常,例如尝试通过a访问对象 空引用;和索引异常,例如尝试访问 通过索引太大或太小的数组元素。
运行时异常可以发生在程序的任何地方,也可以是典型的 一个他们可以很多。必须添加运行时异常 每个方法声明都会降低程序的清晰度。就这样 编译器不要求您捕获或指定运行时异常 (虽然你可以)。
由于程序员没有义务捕获方法抛出的RuntimeException
,因此在重写方法的情况下对未经检查的异常设置相同的限制是没有意义的。