在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 {
}
答案 0 :(得分:9)
RuntimeException是可以进行恢复的异常的未经检查异常的子集。
在编译时不检查未经检查的异常,这意味着编译器不需要方法来捕获或指定(带有抛出)它们。
未经检查的例外类是RuntimeException类 它的子类,以及类Error和它的子类。所有其他 异常类是 已检查 异常类。
请通过此图片检查异常层次结构:
简而言之,任何派生自“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,这些情况无法预测,因为程序可以很好地使用正确的结构。正如其他人所说,这是未经检查的。
异常不同,您必须告诉程序如何处理众所周知的异常情况。这意味着编译器将强制您在开始运行之前以某种方式处理异常。