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