Java中的可丢弃方法重写

Java中的可丢弃方法重写,java,Java,首先,对不起我的英语不好。 问题: 如果我有一个子类扩展了一个抛出选中异常的方法,为什么Java允许我在该子类的重写方法中抛出RuntimeException,如下面的示例所示: public class A { public void doSomething() throws FileNotFoundException { System.out.println("doing something..."); } } 然后 public class B exte

首先,对不起我的英语不好。 问题: 如果我有一个子类扩展了一个抛出选中异常的方法,为什么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...");
    }
}
公共类B扩展了{

public void doSomething()抛出RuntimeException{//任何方法都可以抛出
RuntimeException
Error
-未经检查的异常基类。因此
抛出RuntimeException
与其他任何内容无关

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

不能加宽throws子句,因为引用基类的客户端代码不需要它


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

关于这些限制的全部思想是,子类不应强制调用方捕获另一种类型的已检查异常,而不是重写的方法声明指定的异常(无论是广义的还是完全无关的)

就你而言:

  • throws-FileNotFoundException
    B.doSomething
    中被完全省略:这很好(如果子类的方法声明抛出
    FileNotFoundException
    的子类也可以)。如果
    B.doSomething()
    声明的
    抛出IOException
    或完全无关的东西,如
    抛出SqlException
  • 抛出RuntimeException
    声明它可以抛出未经检查的异常。调用方无论如何都不会被强制捕获未经检查的异常,因此这不会中断为调用
    A.doSomething()而编写的任何代码。

因为
运行时异常
不是选中的异常。