Java中的可丢弃方法重写
首先,对不起我的英语不好。 问题: 如果我有一个子类扩展了一个抛出选中异常的方法,为什么Java允许我在该子类的重写方法中抛出RuntimeException,如下面的示例所示:Java中的可丢弃方法重写,java,Java,首先,对不起我的英语不好。 问题: 如果我有一个子类扩展了一个抛出选中异常的方法,为什么Java允许我在该子类的重写方法中抛出RuntimeException,如下面的示例所示: public class A { public void doSomething() throws FileNotFoundException { System.out.println("doing something..."); } } 然后 public class B exte
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...");
}
}
公共类B扩展了{
public void doSomething()抛出RuntimeException{//任何方法都可以抛出RuntimeException
或Error
-未经检查的异常基类。因此抛出RuntimeException
与其他任何内容无关
您可以使用更窄的throws子句重写方法。throws FileNotFoundException
并不意味着该方法必须抛出异常。基类中的方法可以抛出异常;在这种情况下,派生方法中的方法不会抛出异常
不能加宽throws子句,因为引用基类的客户端代码不需要它
这类似于协变返回类型,在协变返回类型中,您可以缩小派生类/接口中方法的返回类型。关于这些限制的全部思想是,子类不应强制调用方捕获另一种类型的已检查异常,而不是重写的方法声明指定的异常(无论是广义的还是完全无关的)
就你而言:
throws-FileNotFoundException
在B.doSomething
中被完全省略:这很好(如果子类的方法声明抛出FileNotFoundException
的子类也可以)。如果B.doSomething()
声明的抛出IOException
或完全无关的东西,如抛出SqlException
抛出RuntimeException
声明它可以抛出未经检查的异常。调用方无论如何都不会被强制捕获未经检查的异常,因此这不会中断为调用A.doSomething()而编写的任何代码。
因为运行时异常
不是选中的异常。