为什么重写方法不能抛出比重写方法更广泛的异常?

新手上路,请多包涵

我正在阅读 Kathe sierra 的 SCJP 6 书,发现了关于在重写方法中抛出异常的解释。我完全不明白。任何人都可以向我解释一下吗?

覆盖方法不得抛出比被覆盖方法声明的异常新的或范围更广的已检查异常。例如,声明 FileNotFoundException 的方法不能被声明 SQLException、Exception 或任何其他非运行时异常的方法覆盖,除非它是 FileNotFoundException 的子类。

原文由 arpanoid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 626
2 个回答

这意味着如果一个方法声明抛出给定的异常,子类中的覆盖方法只能声明抛出该异常或其子类。例如:

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

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

   @Override
   public void foo() throws SQLException {..} // NOT allowed
}

SocketException extends IOException ,但是 SQLException 没有。

这是因为多态性:

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

如果 B 决定抛出 SQLException ,那么编译器不能强制你捕捉它,因为你指的是 B -c-851fb 的实例 A 。另一方面, IOException IOException 子句(catch或throws)处理

您需要能够通过超类引用对象的规则是 Liskov 替换原则。

由于未经检查的异常可以在任何地方抛出,因此它们不受此规则的约束。如果需要,您可以将未经检查的异常作为一种文档形式添加到 throws 子句中,但编译器不会强制执行任何相关操作。

原文由 Bozho 发布,翻译遵循 CC BY-SA 3.0 许可协议

覆盖方法可以抛出任何未经检查的(运行时)异常,无论覆盖方法是否声明异常

例子:

 class Super {
    public void test() {
        System.out.println("Super.test()");
    }
}

class Sub extends Super {
    @Override
    public void test() throws IndexOutOfBoundsException {
        // Method can throw any Unchecked Exception
        System.out.println("Sub.test()");
    }
}

class Sub2 extends Sub {
    @Override
    public void test() throws ArrayIndexOutOfBoundsException {
        // Any Unchecked Exception
        System.out.println("Sub2.test()");
    }
}

class Sub3 extends Sub2 {
    @Override
    public void test() {
        // Any Unchecked Exception or no exception
        System.out.println("Sub3.test()");
    }
}

class Sub4 extends Sub2 {
    @Override
    public void test() throws AssertionError {
        // Unchecked Exception IS-A RuntimeException or IS-A Error
        System.out.println("Sub4.test()");
    }
}

原文由 syrus.phoenix 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题