在异常处理中,众所周知,如果超类方法没有声明异常,则子类重写方法不能声明已检查的异常,但它可以声明未经检查的异常。为什么这样?请考虑以下示例:
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并不允许它们。谁能解释一下呢?
答案 0 :(得分:0)
这是因为你违反了Liskov substitution principle,即:你不能用一个子类替换超类的实例,因为你正在修改父亲中方法msg
的签名超类。
在更通用的类中,方法msg
不会抛出任何异常,并且您希望修改子类中的签名,这显然是不允许的,因为它违反了{{1}的合同校长。
答案 1 :(得分:0)
您需要记住一件事,如果您使用throws关键字,那么任何异常的发生都会被转发到调用链中,并且在编译时被覆盖的情况下,编译器会检查是否在父级中存在被覆盖的方法,并且JVM执行子类方法。 因此,基本上从父级调用子方法,因此,如果子方法抛出CE以外的任何异常,它应该能够处理检查的异常。 希望对您有所帮助:)