首先,对不起我的英语不好。问题:如果我有一个子类扩展了引发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)
任何方法都可以抛出RuntimeException或Error-未经检查的异常基类。因此,throws RuntimeException与其他任何内容均无关。
您可以使用更窄的throws子句覆盖方法。本throws FileNotFoundException并不意味着该方法必须抛出异常。基类中的方法可能会抛出它;在这种情况下,派生方法中的方法不存在。
您不能扩展throws子句,因为带有基类引用的客户端代码不会期望它。
这类似于协变返回类型,在协变返回类型中,您可以缩小派生类/接口中方法的返回类型。