有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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...");
    }
}

共 (2) 个答案

  1. # 1 楼答案

    任何方法都可以抛出RuntimeExceptionError——未经检查的异常基类。所以throws RuntimeException与其他任何东西都无关

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

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

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

  2. # 2 楼答案

    关于这些限制的整体想法是,子类不应强制调用方捕获另一种类型的已检查异常,而不是被重写的方法声明指定的异常(可以是更广泛的异常,也可以是完全不相关的异常)

    就你而言:

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