9

为什么Java中的两种异常类型分别命名为“checked”和“unchecked”?这些名字背后的原因是什么?

4

4 回答 4

13

如果您调用一个声明为抛出已检查异常的方法(例如IOException),编译器将检查您是否正在捕获它或声明您重新抛出它。同样,为了首先抛出这样的检查异常,编译器会检查您是否已将其声明为方法签名的一部分。

基本上,它有点像类型检查,除了方法可以抛出哪些异常。

编译器不会对未经检查的异常进行任何检查——因此它们可以被任何方法抛出,而无需方法声明它们。

于 2012-10-27T21:18:04.240 回答
4

Java 编译器检查已检查的异常:它检查您是否捕获它们或在方法签名中声明它们。

于 2012-10-27T21:18:20.427 回答
2

“已检查”意味着您要么必须捕获它,要么声明您的方法将其放入签名中。您的方法的用户必须捕获您检查的异常。否则将导致编译器错误。

“未检查”意味着您和您的方法的用户都不需要捕获异常。您不需要在方法签名的 throws 子句中声明它。

在其最早的化身中,Java 经常选择第一个。

C# 将未经检查的异常设为默认值。Java 开发人员现在也采用了这种约定。

于 2012-10-27T21:18:42.977 回答
1

在 Java 中,你可以抛出任何Throwable. Throwable 有两个子类:ErrorException. 当Error抛出一个严重的问题时,通常与您的代码几乎没有关系。编译器不检查此类异常,是未经检查的异常的一个示例

Exception 有一个称为 的子类RuntimeException,它们通常是表示代码中存在错误的异常,并且通常会在大多数代码中的很多地方发生。示例是NullPointerException,ArrayIndexOutOfBoundsException等。这些也未选中,因为您会在代码中乱扔这些捕获物。

编译器会检查所有其他异常,您必须捕获或抛出它们。

于 2012-10-27T21:25:23.227 回答