运行时异常扩展异常和自定义异常从异常延伸为什么后一个是编译时异常而另一个不是?

时间:2013-01-21 09:37:25

标签: java exception exception-handling runtimeexception

在Java中,我有一个从Exception扩展的Exception类,但每当我抛出它时,编译器都说它需要被捕获/必须声明方法throws Exception。

当我使用从RuntimeException扩展的Exception时,编译器不会停止,它将它们视为运行时异常,我们无需处理它。

有没有办法让我可以从Exception扩展MyException并将其作为运行时异常。或者是什么使这成为课程RuntimeException

的可能性
private void compileTime() throws MyException{
        throw new MyException();
    }

    private void runTime() {
        throw new MyRuntimeException();
    }

    class MyException extends Exception {

    }
    class MyRuntimeException extends RuntimeException {

    }

4 个答案:

答案 0 :(得分:9)

RuntimeException是可以进行恢复的异常的未经检查异常的子集。

在编译时不检查未经检查的异常,这意味着编译器不需要方法来捕获或指定(带有抛出)它们。

  

未经检查的例外类是RuntimeException类   它的子类,以及类Error和它的子类。所有其他   异常类是 已检查 异常类。

请通过此图片检查异常层次结构: exception hierarchy

简而言之,任何派生自“Exception”的异常都是一个经过检查的异常,而未检查派生自RuntimeException的类。调用代码不需要显式处理RuntimeExceptions。

答案 1 :(得分:3)

没办法。根据规范,只有从RuntimeException类或Error类扩展的异常才被视为未经检查的异常(JLS 7,第11.1.1页)。

答案 2 :(得分:1)

您所谓的“编译时”异常称为已检查异常。正如您所说,编译器将要求您将其包含在方法签名中,并且您的调用者将需要处理它可能被抛出的可能性。

RuntimeException明确用于“未经检查”的异常情况。

来自文档

  

不需要在throws子句中声明任何方法   可能在执行期间抛出的RuntimeException的子类   执行该方法但未被捕获。

如果你想要一个未经检查的excption,那么只需要扩展RuntimeException。

答案 3 :(得分:0)

RuntimeException 在方法开头不需要try-catch组合或抛出。仅仅因为它发生在运行时,例如你想要引用10个元素长数组的第14个元素或者因为忘记设置某个值的值而得到NullPointerException,这些情况无法预测,因为程序可以很好地使用正确的结构。正如其他人所说,这是未经检查的。

异常不同,您必须告诉程序如何处理众所周知的异常情况。这意味着编译器将强制您在开始运行之前以某种方式处理异常。