6

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

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

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

我也在网站上看到了这个,你能解释一下报价吗?

许多人说根本不应该使用已检查的异常(即您应该明确捕获或重新抛出的异常)。

Java:已检查与未检查的异常解释

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

NumberFormatException 未选中`

但我认为这NumberFormatException是经过检查的,因为我会在编译时处理它。你能帮我理解吗?我做过一些 Java 编程,但我从未编写过自己的异常类,为什么需要它? 在此处输入图像描述

更新

Sierra / Bates 的 SCJP 书给出了一个定义:

在此处输入图像描述

4

3 回答 3

7

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

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

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

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

于 2013-04-21T14:13:32.580 回答
3

更广泛的定义是:

CheckedExceptions 是您必须明确处理的异常。你要么必须声明你可以扔掉它,要么抓住它并处理它。坎宁安维基

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

于 2013-04-21T14:22:59.583 回答
2

Checked exceptions 允许您在编译时验证您是在处理异常还是声明它们被抛出。

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

来自Java 教程

[P]程序员可能会想编写只抛出未经检查的异常的代码,或者让他们的所有异常子类都继承自 RuntimeException。这两种快捷方式都允许程序员编写代码,而无需担心编译器错误,也无需担心指定或捕获任何异常。尽管这对程序员来说似乎很方便,但它回避了捕获或指定要求的意图,并且可能会给使用您的类的其他人带来问题。

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

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

NumberFormatException 未选中,因为它属于这个阵营。在许多应用程序中,数字格式异常几乎可以在任何地方发生,并且数量众多。

于 2013-04-21T14:15:50.353 回答