在java中扩展Exception / RunTimeException?

时间:2013-11-08 10:40:58

标签: java exception

我有以下课程。

public class ValidationException extends RuntimeException {


}

public class ValidationException extends Exception {


}

我很困惑自定义异常何时应该扩展RunTimeException以及何时必须扩展Exception。能否请您解释一下,直接延长RunTimeException是否有任何不利之处?

谢谢!

5 个答案:

答案 0 :(得分:42)

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

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

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

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

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

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

来源/进一步阅读: Unchecked Exceptions - The Controversy

答案 1 :(得分:9)

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

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

答案 2 :(得分:7)

  

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

     

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

     

以下是底线指南:如果可以合理地期望客户端从异常中恢复,请将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。

了解更多read this.

答案 3 :(得分:0)

RuntimeException

的定义
  

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

     

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

如果你延长Exception,你需要抓住你扔ValidationException的地方。

答案 4 :(得分:0)

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

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