64

我有以下课程。

public class ValidationException extends RuntimeException {


}

public class ValidationException extends Exception {


}

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

谢谢!

4

5 回答 5

64

RuntimeException 未检查,而 Exception 已检查(调用代码必须处理它们)。

RuntimeException如果您想取消选中自定义异常,则应该扩展它,否则使用Exception.

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

由于调用方法可能无法处理 `RuntimeException`,因此在抛出 RuntimeException 时需要小心

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

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

来源/进一步阅读: 未经检查的例外 - 争议

于 2013-11-08T10:45:37.207 回答
16

如果你 extend RuntimeException,你不需要在 throws 子句中声明它(即它是一个未经检查的异常)。如果你扩展 Exception,你会这样做(这是一个检查的异常)。

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

于 2013-11-08T10:45:55.427 回答
8

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

一般来说,不要仅仅因为您不想为指定方法可以抛出的异常而烦恼,就抛出 RuntimeException 或创建 RuntimeException 的子类。

这是底线准则:如果可以合理地期望客户端从异常中恢复,则将其设为已检查异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。

更多阅读这个。

于 2013-11-08T10:48:43.293 回答
1

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

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

于 2014-09-22T10:38:52.283 回答
1

RuntimeException的定义

RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。

RuntimeException 及其子类是未经检查的异常。如果未经检查的异常可以通过方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则不需要在方法或构造函数的 throws 子句中声明它们。

如果你扩展Exception,你需要抓住你扔的地方ValidationException

于 2013-11-08T10:48:37.007 回答