您可以声明一个重写方法,使其抛出的异常类型比超类少,而您不能引入新的异常。子类方法必须与超类方法的行为兼容。更准确地说,您必须能够在不破坏任何内容的情况下用子类的对象替换超类的对象(在throws子句中添加新的已检查异常将意味着调用它的事物将必须更改其代码以对其进行处理)。
(这背后的想法是Liskov替换原理:程序应该能够在不涉及任何确切类型细节的情况下高层次地处理对象。如果子类可以引入更改,则意味着程序必须选择它们并以不同的方式处理它们,这将破坏抽象的目的。)
因此,可以将一个覆盖方法声明为根本不引发任何检查异常(通过完全省略throws子句),因为这不需要更改任何调用方。
JDK中有一些示例,例如java.io中的示例,其中子类不可能抛出由超类声明的异常(请参见ByteArrayOutputStream
close方法)。在这里,close方法可能已删除了throws子句,因为它从不抛出IOException。(也许是有人希望使用确实引发IOException的版本将其子类化吗?)



