运行时异常没有编译错误。为什么?

时间:2011-05-27 09:56:38

标签: java

在下面的示例中,如果RuntimeException被其他一些异常替换,则编译器会抛出编译错误。但对于Runtime Exception而言,它并没有抛出任何东西。为什么?请解释一下。

class A {
    public void process() {
        System.out.print("A,");

    }
}

class B extends A {
    public void process() throws RuntimeException {
        System.out.print("B,");
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        A a = new B();
        a.process();
    }
}

5 个答案:

答案 0 :(得分:4)

RuntimeException是我们称之为“未经检查的例外”。

这意味着,编译器不会检查它们是否被代码捕获。

原因是,我们有一些例外情况,我们通常不愿意处理或声明。例如,NullPointerException可能会在代码中的许多地方被抛出,如果我们只是处理它们,如果我们明确决定,它会更方便。

另见:

答案 1 :(得分:3)

这与checked vs unchecked exceptions有关。这是另一个brief explanation

答案 2 :(得分:1)

这就是为什么它被称为RuntimeException:)

严重的是,RuntimeException(所有从它继承的异常)都被称为“未经检查的异常”,并且重点是它们不会被编译器检查。

答案 3 :(得分:1)

由于the following requirement in the Java Language Specification

,这是编译器所必需的
  

11.2.5为什么不检查运行时异常

     

运行时异常类   (RuntimeException及其子类)   免于编译时   检查,因为,在判断   Java编程的设计者   语言,必须声明这样的   例外不会有很大帮助   建立正确性   程式。许多操作和   Java编程的构造   语言可以导致运行时   例外。可用信息   到编译器,和级别   分析编译器执行的,是   通常不足以建立   这样的运行时异常不能   即使这可能是显而易见的   给程序员。需要这样的   要声明的异常类   只是是一种恼怒   程序员。

     

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

已检查的异常不同,运行时异常(或未经检查的异常)不定义调用方和被调用方法之间的契约,因为它们通常表示错误的条件,通常由调用方解决。它是遵守合同的。

如果编译器被赋予执行此类合同的任务,则会导致额外的复杂性(在语言本身和人们编写的代码中)。想象一下,强制执行每个方法以检查空参数并要求程序员抛出此类异常(并在throws子句中声明此类异常)。更简单的方法是指定一个合同,声明一个方法不会对null参数进行操作,并且调用者应该期望捕获NullPointerExceptions;如果调用者想要避免这种情况,它必须在调用方法之前检查参数。

答案 4 :(得分:0)

原因是为重写方法声明的已检查异常必须与重写方法的签名匹配。否则,由于方法签名不匹配,代码将无法编译。在覆盖方法中声明未经检查的异常时很好,因为名称建议的这些异常不会被编译器检查