4

子类中的方法是否可以覆盖父类中的方法并在父类中的方法没有抛出异常时抛出运行时异常?像这样的东西:

class X { public void foo() { System.out.print("X "); } }

public class SubB extends X {
    public void foo() throws RuntimeException {
        super.foo();
        if (true) 
            throw new RuntimeException();
        System.out.print("B ");
    }

    public static void main(String[] args) {
        new SubB().foo();
    }
}
4

1 回答 1

3

是的,因为运行时异常不是方法签名的一部分。(您可以添加它们,但编译器不在乎,它们只是文档。)

我认为基本原理是 RuntimeExceptions 通常是程序员错误,例如 NPE 或超出数组范围,因此尝试以限制检查异常的方式限制它们是没有意义的。您不能制定规则说,此方法(以及任何覆盖它的方法)永远不会抛出 NullPointerException,因为 JVM 不会做出这些保证。

编译时异常检查下的 Java 语言规范中它说:

未经检查的异常类(§11.1.1)免于编译时检查。

在未经检查的异常类中,错误类被排除在外,因为它们可以在程序中的许多点发生,并且很难或不可能从它们中恢复。声明此类异常的程序将毫无意义地混乱。复杂的程序可能仍希望捕获并尝试从其中一些条件中恢复。

在未经检查的异常类中,运行时异常类被免除,因为根据 Java 编程语言的设计者的判断,必须声明此类异常不会显着帮助确定程序的正确性。Java 编程语言的许多操作和构造都可能导致运行时异常。Java 编译器可用的信息以及编译器执行的分析级别通常不足以确定不会发生此类运行时异常,即使这对程序员来说可能是显而易见的。要求声明这样的异常类只会让程序员感到恼火。

例如,某些代码可能实现了一个循环数据结构,通过构造,它永远不会涉及空引用;然后,程序员可以确定 NullPointerException 不会发生,但 Java 编译器很难证明这一点。建立数据结构的这种全局属性所需的定理证明技术超出了本规范的范围。

于 2012-07-11T18:02:40.213 回答