给定:
static class A {
void process() throws Exception { throw new Exception(); }
}
static class B extends A {
void process() { System.out.println("B "); }
}
public static void main(String[] args) {
A a = new B();
a.process();
}
在这个问题中,当我调用a.process()
时,它会给我一个编译时错误,提示“必须处理未处理的异常”。但是,如果父方法抛出任何已检查的异常,如果我们重写父方法的实现,则无需在子方法中处理该异常。
为什么仍然检查异常?
最佳答案
重点是编译器不知道您正在调用一个不会抛出任何已检查异常的重写方法。当它看到时:
a.process();
它“不知道”a
的值实际上是对 B
实例的引用。它可以是对 A
实例(或另一个子类的实例)的引用,会抛出异常。
如果你想使用特定于子类的签名,你需要:
B b = new B();
相反。然后当编译器看到
b.process();
它将查看方法是如何在 B
中声明的,而不是如何在 A
中声明的。
关于java - 如果父方法抛出检查异常,那么是否必须在子类中抛出相同的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861908/