为何 JAVA 中子类异常类型不能比父类异常类型的范围更大

如果一个方法声明了会抛错,子类中重写的方法只能声明抛出同样的异常或者是抛出该异常的子类。

class A {
   public void foo() throws IOException {..}
}

class B extends A {
   @Override
   public void foo() throws SocketException {..} // 允许

   @Override
   public void foo() throws SQLException {..} // 不允许
}

SocketException 继承了 IOException, 但是 SQLException 不继承.

这样的规定是出于多态的考虑。

A a = new B();
try {
    a.foo();
} catch (IOException ex) {
    // forced to catch this by the compiler
}

如果 B 要抛出 SQLException,编译器并不能强制让你去捕获该异常,因为此时正使用 B 的父类 A。

The rule that you need to be able to refer to objects by their superclass is the Liskov Substitution Principle.

原帖地址:http://stackoverflow.com/questions/5875414/why-cant-overriding-methods-throw-exceptions-broader-than-the-overriden-method

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>