Java中的可抛出方法重写

Joh*_*oni 4 java

首先,对不起我的英语不好。问题:如果我有一个子类扩展了引发CHECKED异常的方法,为什么Java允许我在子类的重写方法中抛出RuntimeException,如下例所示:

public class A {

    public void doSomething() throws FileNotFoundException {
        System.out.println("doing something...");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后...

public class B extends A {
    public void doSomething() throws RuntimeException { // <- my question
            System.out.println("doing something here too...");
    }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ine 8

任何方法都可以抛出RuntimeExceptionError-未经检查的异常基类。因此,throws RuntimeException与其他任何内容均无关。

您可以使用更窄的throws子句覆盖方法。本throws FileNotFoundException并不意味着该方法必须抛出异常。基类中的方法可能会抛出它;在这种情况下,派生方法中的方法不存在。

您不能扩展throws子句,因为带有基类引用的客户端代码不会期望它。

这类似于协变返回类型,在协变返回类型中,您可以缩小派生类/接口中方法的返回类型。