子类中的方法是否可以覆盖父类中的方法,并在父类中的方法不引发异常时抛出运行时异常?像这样:
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();
}
}
答案 0 :(得分:3)
是的,因为运行时异常不是方法签名的一部分。 (您可以添加它们,但编译器并不关心,它们只是文档。)
我认为基本原理是RuntimeExceptions通常是程序员错误,比如NPE或超出数组的范围,因此尝试以限制检查异常的方式限制它们是没有意义的。你不能说规则,这个方法(以及任何覆盖它的方法)永远不会抛出NullPointerException,因为JVM不会做出那些保证。
在Compile-Time Checking of Exceptions下的Java语言规范中,它说:
未经检查的异常类(第11.1.1节)免除 编译时检查。
在未经检查的异常类中,错误类是免除的,因为 它们可以在程序的许多点上发生,并从中恢复 困难或不可能。宣布此类例外的计划将是 一尘不染,毫无意义。复杂的计划可能希望赶上 并尝试从某些条件中恢复。
在未经检查的异常类中,运行时异常类是 因为,在Java的设计者的判断中被豁免 编程语言,必须声明这样的例外不会有帮助 在确定程序的正确性方面。很多人 可以产生Java编程语言的操作和构造 在运行时的例外情况中。 Java可用的信息 通常,编译器和编译器执行的分析级别 不足以确定此类运行时异常不能 即使这对程序员来说可能是显而易见的。要求 要声明的这类异常类只会令人恼火 程序员。
例如,某些代码可能实现循环数据结构 通过构造,永远不会涉及空引用;该 程序员可以确定NullPointerException不能 发生了,但Java编译器很难证明它。该 建立这种全球性所需的定理证明技术 数据结构的属性超出了这个范围 说明书