方法骑马,继承和例外

时间:2012-07-11 18:01:37

标签: java exception inheritance runtimeexception method-overriding

子类中的方法是否可以覆盖父类中的方法,并在父类中的方法不引发异常时抛出运行时异常?像这样:

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();
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

Compile-Time Checking of Exceptions下的Java语言规范中,它说:

  

未经检查的异常类(第11.1.1节)免除   编译时检查。

     

在未经检查的异常类中,错误类是免除的,因为   它们可以在程序的许多点上发生,并从中恢复   困难或不可能。宣布此类例外的计划将是   一尘不染,毫无意义。复杂的计划可能希望赶上   并尝试从某些条件中恢复。

     

在未经检查的异常类中,运行时异常类是   因为,在Java的设计者的判断中被豁免   编程语言,必须声明这样的例外不会有帮助   在确定程序的正确性方面。很多人   可以产生Java编程语言的操作和构造   在运行时的例外情况中。 Java可用的信息   通常,编译器和编译器执行的分析级别   不足以确定此类运行时异常不能   即使这对程序员来说可能是显而易见的。要求   要声明的这类异常类只会令人恼火   程序员。

     

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