在 java 中扩展 Exception/RunTimeException? ?

我有以下课程。

public class ValidationException extends RuntimeException {




}

还有

public class ValidationException extends Exception {




}

我对自定义异常何时应该扩展 RunTimeException以及何时必须扩展 Exception感到困惑。能否请您解释一下直接扩展 RunTimeException有什么缺点?

谢谢!

83160 次浏览

在选中 Exception 时取消选中 RuntimeException (调用 代码必须处理它们)。

自定义异常应该扩展 RuntimeException,如果您使用 Exception扩展 想让它不受约束的话。

对于未检查的异常,调用代码方法不需要在其 throw 子句中声明在方法执行期间可能抛出但未捕获的 RuntimeException的任何子类。

由于调用方法可能无法处理“ RuntimeException”,因此必须是 抛出 RuntimeException 时要小心

运行时异常表示的问题是编程问题的结果,因此,不能合理地期望 API 客户机代码从中恢复或以任何方式处理它们。这些问题包括算术异常,例如除以零; 指针异常,例如试图通过空引用访问对象; 索引异常,例如试图通过过大或过小的索引访问数组元素。

运行时异常可能发生在程序的任何地方,在一个典型的程序中,它们可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求您捕获或指定运行时异常(尽管您可以)。

资料来源/进一步阅读: < a href = “ https://docs.oracle.com/javase/砖家/教程/基本/例外/runtime.html”rel = “ noReferrer”> 未检查的例外-争议

如果扩展 RuntimeException,则不需要在 throw 子句中声明它(即它是一个未检查的异常)。如果您扩展了 Exception,那么就扩展了(它是一个已检查的异常)。

有些人认为所有的异常都应该从 RuntimeException扩展,但是如果您想强制用户处理异常,那么您应该改为扩展 Exception

RuntimeException的定义

RuntimeException 是这些异常的超类,它们可以在 Java 虚拟机的正常操作期间抛出。

RuntimeException 及其子类是未检查的异常。 未检查的异常不需要在方法或 构造函数的 throw 子句,如果它们可以通过执行 方法或构造函数,并在方法或 构造函数边界构造函数边界。

如果你延长 Exception,你需要抓住任何你抛出你的 ValidationException的地方。

抛出 RuntimeException 的一种常见情况是用户不正确地调用方法。例如,一个方法可以检查它的一个参数是否错误地为 null。如果参数为 null,则该方法可能引发 NullPointerException,这是一个未检查的异常。

一般来说,不要仅仅因为不希望指定方法可以引发的异常而引发 RuntimeException 或创建 RuntimeException 的子类。

下面是底线指导原则: 如果可以合理地期望客户端从异常中恢复,那么将其设置为已检查的异常。如果客户端无法从异常中恢复,则将其设置为未检查的异常。

更多的 看看这个。

如果您在一个应用程序框架中,并且您的框架能够很好地处理来自代码的异常通知时的异常。在这种情况下,可以将自定义异常类用作 RuntimeException 的子类。

这将帮助您从 NOT 编写代码来处理异常层次结构中的异常。