方法覆盖异常

Moh*_*han 0 java polymorphism overriding exception

我有一个下面的程序:

class SuperClassWas {
    void myM() throws NullPointerException{
        System.out.println("Super class myM called.");
    }
}

class SubClassWas extends SuperClassWas{
    void myM() throws RuntimeException{
        System.out.println("Sub class myM called.");
    }
}

public class MethodOveridingWithException {
    public static void main(String[] args) {
        SuperClassWas obj = new SubClassWas();
        obj.myM();
    }
}
Run Code Online (Sandbox Code Playgroud)

按照规则

如果SuperClass声明了异常,则SubClass只能声明SuperClass声明的异常的子级异常,而不能声明其他任何异常。

在我的程序中,超级类方法myM扩展了NullPointerException,子类重写方法myM扩展了RuntimeException,当我尝试运行程序时,它运行良好。问题是为什么?理想情况下,它不应工作,因为RuntimeException它不是的子类NullPointerException

如果我错了,请纠正我。

Kar*_*tik 5

此规则仅对已检查的异常有效

这是JLS的报价:

更精确地,假设B是类或接口,而A是B的超类或超接口,并且B中的方法声明n覆盖或隐藏A中的方法声明m。然后:

如果n具有引发任何检查过的异常类型的throws子句,则m必须具有throws子句,否则会发生编译时错误。

对于n的throws子句中列出的每个检查的异常类型,必须在m的throws子句的擦除(第4.6节)中出现相同的异常类或其超类之一;否则,将发生编译时错误。

如果m的未擦除throws子句在n的throws子句中不包含每种异常类型的超类型,则会发生编译时未检查的警告。

您问题中的例外是未经检查的例外。