【问题标题】:Extending Exception/RunTimeException in java?在 java 中扩展 Exception/RunTimeException?
【发布时间】:2013-11-08 10:40:58
【问题描述】:

我有以下课程。

public class ValidationException extends RuntimeException {


}

public class ValidationException extends Exception {


}

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

谢谢!

【问题讨论】:

标签: java exception


【解决方案1】:

RuntimeException 在检查异常时未检查(调用 代码必须处理它们)。

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

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

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

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

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

来源/延伸阅读: Unchecked Exceptions - The Controversy

【讨论】:

  • 引用@Batty 的回答:如果可以合理地期望客户端从异常中恢复,请将其设为已检查异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。
  • 需要注意的重要一点是受检异常是制动封装。例如,调用者需要知道被调用者可能会抛出什么类型的异常,因此调用者对被调用者有内部知识,这是破坏封装的原因。如果您正在使用 OOP 进行编程,这可能是一个问题(我并没有真正使用函数式编程或过程式编程,所以我不能真正说出在这些实践中它是如何实现的)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    通常会抛出 RuntimeException 的一种情况是用户错误地调用了方法。例如,一个方法可以检查其参数之一是否错误地为空。如果参数为 null,则该方法可能会抛出 NullPointerException,这是一个未经检查的异常。

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

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

    了解更多read this.

    【讨论】:

      【解决方案4】:

      RuntimeException的定义

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

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

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

      【讨论】:

        【解决方案5】:

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

        这将帮助您避免编写代码来处理整个异常层次结构中的异常。

        【讨论】:

          猜你喜欢
          • 2014-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 1970-01-01
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多