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

问题描述 投票:4回答:4

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

当我使用从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 {

    }
java exception exception-handling runtimeexception
4个回答
9
投票

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

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

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

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

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


3
投票

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


1
投票

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

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

来自文档

一个方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未捕获。

因此,如果您想要一个未经检查的异常,只需扩展RuntimeException。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.