我有以下课程。
public class ValidationException extends RuntimeException {
}
和
public class ValidationException extends Exception {
}
我很困惑自定义异常何时应该扩展RunTimeException
以及何时必须扩展Exception
。能否请您解释一下,直接延长RunTimeException
是否有任何不利之处?
谢谢!
答案 0 :(得分:42)
选中Exception时,将取消选中RuntimeException(调用 代码必须处理它们。)
如果想要取消选中,则自定义异常应该扩展RuntimeException,否则使用Exception扩展它。
使用未经检查的异常调用代码方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间被抛出但未被捕获。
由于调用方法可能无法处理RuntimeException,因此在抛出RuntimeException 时需要小心。
运行时异常表示编程问题导致的问题,因此,无法合理地期望API客户端代码从它们恢复或以任何方式处理它们。这些问题包括算术异常,例如除以零;指针异常,例如尝试通过空引用访问对象;和索引异常,例如尝试通过索引太大或太小来访问数组元素。
运行时异常可以发生在程序的任何地方,而在典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求您捕获或指定运行时异常(尽管可以)。
来源/进一步阅读: Unchecked Exceptions - The Controversy
答案 1 :(得分:9)
如果扩展RuntimeException
,则不需要在throws子句中声明它(即它是未经检查的异常)。如果扩展Exception,则执行(这是一个经过检查的异常)。
有些人认为所有异常都应该从RuntimeException
延伸,但是如果你想强迫用户处理异常,你应该扩展Exception
。
答案 2 :(得分:7)
抛出RuntimeException的常见做法之一是用户错误地调用方法。例如,方法可以检查其中一个参数是否错误地为null。如果参数为null,则该方法可能抛出NullPointerException,这是一个未经检查的异常。
一般来说,不要抛出RuntimeException或创建RuntimeException的子类,因为您不希望因指定方法可以抛出的异常而烦恼。
以下是底线指南:如果可以合理地期望客户端从异常中恢复,请将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。
了解更多read this.
答案 3 :(得分:0)
RuntimeException是在Java虚拟机正常运行期间可以抛出的那些异常的超类。
RuntimeException及其子类是未经检查的异常。 未经检查的异常不需要在方法中声明 构造函数的throws子句,如果它们可以被执行抛出 方法或构造函数并在方法或方法之外传播 构造函数边界。
如果你延长Exception
,你需要抓住你扔ValidationException
的地方。
答案 4 :(得分:0)
如果您在应用程序框架中,并且在您的代码发出异常通知时,您的框架可以处理异常。在这种情况下,您可以使用自定义异常类作为RuntimeException的子类。
这将帮助您不要编写代码来处理异常层次结构中的异常。