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