已检查Java异常的定义?

时间:2013-04-21 14:09:56

标签: java exception exception-handling

我看到一个定义可以是这样的:

  

通常,RuntimeExceptions是可以阻止的异常   编程。

但这仍然不是已检查异常的定义。我认为已检查的异常是“可在编译时处理的异常”。这是正确的和/或你能告诉我更多吗?

我也在网站上看过这个,你能解释一下这个引用吗?

  

很多人都说经过检查的例外(即你应该这样做的   明确地抓住或重新抛出)根本不应该使用。

Java: checked vs unchecked exception explanation

我可以直接了解定义是什么吗?我也有些意外地读到了:

  

未选中NumberFormatException。

但我认为NumberFormatException已被检查,因为我会在编译时处理它。你能帮我理解一下吗?我已经完成了一些Java编程,但我从未编写过自己的异常类,为什么我需要它呢? enter image description here

更新

给出的定义是Sierra / Bates的SCJP书:

enter image description here

3 个答案:

答案 0 :(得分:7)

已检查的异常被定义为java.lang.Throwable的任何子类(包括Throwable本身),它不是java.lang.Errorjava.lang.RuntimeException的子类。您看到的指南就是指南,旨在帮助您了解运行时异常的意图。

请参阅Java语言规范,第11.1.1节

  

未经检查的异常类是运行时异常类和错误   类。

     

已检查的异常类是除未选中之外的所有异常类   异常类。也就是说,已检查的异常类都是其子类   除了RuntimeException及其子类和Error及其之外的Throwable   子类。

答案 1 :(得分:3)

更广泛的定义是:

  

CheckedExceptions是您必须明确处理的异常。你要么必须声明你可以扔它或抓住它并处理它。 Cunningham Wiki

因此不会检查RuntimeExceptions,但如果方法声明它抛出它并且您被迫捕获或重新抛出,则会检查NumberFormatException。

答案 2 :(得分:2)

经过检查的异常允许您在编译时验证您要么处理异常还是声明它们被抛出。

有些人建议避免检查异常。但是,这并不能消除管理异常的成本。它会从编译时到运行时和调试时间进行移位和放大。

来自Java tutorial

  

[P]程序员可能想要编写仅抛出未经检查的异常的代码,或者让所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码而不必担心编译器错误,也不必费心去指定或捕获任何异常。虽然这对程序员来说似乎很方便,但它会回避catch的意图或指定需求,并且可能会导致其他人使用您的类时遇到问题。

未经检查的例外允许您不必在任何地方声明几乎可以在任何地方发生的异常。来自Java tutorial

  

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

未选中NumberFormatException,因为它属于此阵营。在许多应用程序中,数字格式异常几乎可以发生在任