我正在阅读 Kathe sierra 的 SCJP 6 书,发现了关于在重写方法中抛出异常的解释。我完全不明白。任何人都可以向我解释一下吗?
覆盖方法不得抛出比被覆盖方法声明的异常新的或范围更广的已检查异常。例如,声明 FileNotFoundException 的方法不能被声明 SQLException、Exception 或任何其他非运行时异常的方法覆盖,除非它是 FileNotFoundException 的子类。
原文由 arpanoid 发布,翻译遵循 CC BY-SA 4.0 许可协议
这意味着如果一个方法声明抛出给定的异常,子类中的覆盖方法只能声明抛出该异常或其子类。例如:
SocketException extends IOException
,但是SQLException
没有。这是因为多态性:
如果
B
决定抛出SQLException
,那么编译器不能强制你捕捉它,因为你指的是B
-c-851fb 的实例A
。另一方面,IOException
IOException
子句(catch或throws)处理您需要能够通过超类引用对象的规则是 Liskov 替换原则。
由于未经检查的异常可以在任何地方抛出,因此它们不受此规则的约束。如果需要,您可以将未经检查的异常作为一种文档形式添加到 throws 子句中,但编译器不会强制执行任何相关操作。