在异常处理中,已知如果超类方法不声明异常,则子类重写方法不能声明选中的异常,但它可以声明未检查的异常。为什么会这样?考虑以下示例:
import java.io.*;
class Parent {
void msg() {
System.out.println("parent");
}
}
class TestExceptionChild extends Parent {
void msg() throws IOException {
System.out.println("TestExceptionChild");
}
public static void main(String args[]) {
Parent p = new TestExceptionChild();
p.msg();
}
}
我尝试过的:
我们在这里得到编译错误。如果我需要在被覆盖的方法"msg"中读取文件,那么我必须在那里提到"抛出IOException"。但是Java不允许他们。谁能解释一下?
发生这种情况是因为您违反了 Liskov 替换原则,即:您不能用其中一个子类替换超类的实例,因为您正在修改父超类中msg
方法的签名。
在更通用的类中,方法msg
不会引发任何异常,并且您想修改子类中的签名,这显然是不允许的,因为它违反了override
主体的协定。
你需要记住一件事,如果你使用throws关键字,那么出现任何异常将被转发到调用链中,如果在编译时覆盖编译器检查是否覆盖的方法在父类中,JVM执行子类方法。 因此,基本上从父方法调用子方法,因此如果子方法抛出任何异常,否则 CE,它应该能够处理检查异常。 我希望它对:)有所帮助