在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 {
}
RuntimeException是可以进行恢复的异常的未经检查的异常的子集。
在编译时不检查未经检查的异常,这意味着编译器不需要捕获或指定(带有抛出)它们的方法。
未经检查的异常类是RuntimeException类及其子类,以及类Error及其子类。所有其他异常类都是已检查的异常类。
请通过此图片检查异常层次结构:
简而言之,任何派生自“Exception”的异常都是一个经过检查的异常,而从RuntimeException派生的类是未经检查的。调用代码不需要显式处理RuntimeExceptions。
没门。根据规范,只有从RuntimeException
类或Error
类扩展的异常才被视为未经检查的例外(JLS 7,第11.1.1页)。
您称之为“编译时”异常的内容称为“已检查”异常。正如您所说,编译器将要求您将其包含在方法签名中,并且您的调用者将需要处理它可能被抛出的可能性。
RuntimeException明确用于“未经检查”的异常情况。
来自文档
一个方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未捕获。
因此,如果您想要一个未经检查的异常,只需扩展RuntimeException。
RuntimeException不需要try-catch组合或在方法开头抛出。仅仅因为它发生在运行时,例如你想要引用10个元素长数组的第14个元素或者因为忘记设置某个值而得到NullPointerException,所以这些情况无法预测,因为程序可以很好地使用正确的结构。正如其他人所说,这是未经检查的。
例外情况不同,您必须告诉程序如何处理众所周知的异常情况。这意味着编译器将强制您在开始运行之前以某种方式处理异常。