Java中的可丢弃方法重写
首先,对不起我的英语不好。 问题: 如果我有一个子类扩展了一个抛出选中异常的方法,为什么Java允许我在该子类的重写方法中抛出RuntimeException,如下面的示例所示:
public class A {
public void doSomething() throws FileNotFoundException {
System.out.println("doing something...");
}
}
然后
public class B extends A {
public void doSomething() throws RuntimeException { // <- my question
System.out.println("doing something here too...");
}
}
# 1 楼答案
任何方法都可以抛出
RuntimeException
或Error
——未经检查的异常基类。所以throws RuntimeException
与其他任何东西都无关可以使用更窄的throws子句重写方法。
throws FileNotFoundException
并不意味着该方法必须抛出异常。基类中的方法可能会抛出它;在这种情况下,派生方法中的方法不适用不能加宽throws子句,因为引用基类的客户端代码不需要它
这与协变返回类型类似,在这里可以缩小派生类/接口中方法的返回类型
# 2 楼答案
关于这些限制的整体想法是,子类不应强制调用方捕获另一种类型的已检查异常,而不是被重写的方法声明指定的异常(可以是更广泛的异常,也可以是完全不相关的异常)
就你而言:
throws FileNotFoundException
在B.doSomething
中被完全省略:这很好(如果子类的方法声明抛出FileNotFoundException
的子类也很好)。如果B.doSomething()
声明了throws IOException
或是完全不相关的东西,比如throws SqlException
,就会出现问题李>throws RuntimeException
声明它可以抛出未经检查的异常。无论如何,调用方都不会被迫捕获未经检查的异常,因此这不会破坏为调用A.doSomething()
而编写的任何代码