我有一个子类,并且我重写了继承的父方法:我从方法声明中删除了throws子句。

现在,使用多态,我实例的运行时类型应该确定方法的实现;但是,当我尝试编译时,编译器抱怨并希望在方法调用周围使用try / catch块,就好像是在调用超类方法而不是子类版本一样?

我知道我可以删除throws声明或缩小在覆盖时可以抛出的检查异常。为什么这仍然引发异常?

class A{
    void foo()throws Exception{throw new Exception();}
}

class SubB extends A{
    @Override
    void foo(){  System.out.println("B");
}

public static void main(String[] args) {
    A a = new SubB();
    a.foo(); //compiler reports: unhandled exception type Exception
}

最佳答案

编译器选择一个A,它确实引发异常。但是,如果您告诉编译器它是一个实际的SubB对象,它将停止抱怨

SubB b = new SubB();
b.foo();

10-06 04:55
查看更多