7

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

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

有没有一种方法可以让 MyException 从 Exception 扩展并仍然将其作为运行时异常。?或者是什么让这在课堂上成为可能RuntimeException

private void compileTime() throws MyException{
        throw new MyException();
    }

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

    class MyException extends Exception {

    }
    class MyRuntimeException extends RuntimeException {

    }
4

4 回答 4

11

RuntimeException 是未检查异常的子集,用于可以从中恢复的异常。

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

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

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

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

于 2013-01-21T09:42:38.467 回答
3

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

于 2013-01-21T09:39:47.183 回答
1

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

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

从文档

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

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

于 2013-01-21T09:42:12.673 回答
0

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

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

于 2013-01-21T11:47:38.357 回答