为什么Java中的两种异常类型分别命名为“checked”和“unchecked”?这些名字背后的原因是什么?
4 回答
如果您调用一个声明为抛出已检查异常的方法(例如IOException
),编译器将检查您是否正在捕获它或声明您重新抛出它。同样,为了首先抛出这样的检查异常,编译器会检查您是否已将其声明为方法签名的一部分。
基本上,它有点像类型检查,除了方法可以抛出哪些异常。
编译器不会对未经检查的异常进行任何检查——因此它们可以被任何方法抛出,而无需方法声明它们。
Java 编译器检查已检查的异常:它检查您是否捕获它们或在方法签名中声明它们。
“已检查”意味着您要么必须捕获它,要么声明您的方法将其放入签名中。您的方法的用户必须捕获您检查的异常。否则将导致编译器错误。
“未检查”意味着您和您的方法的用户都不需要捕获异常。您不需要在方法签名的 throws 子句中声明它。
在其最早的化身中,Java 经常选择第一个。
C# 将未经检查的异常设为默认值。Java 开发人员现在也采用了这种约定。
在 Java 中,你可以抛出任何Throwable
. Throwable 有两个子类:Error
和Exception
. 当Error
抛出一个严重的问题时,通常与您的代码几乎没有关系。编译器不检查此类异常,是未经检查的异常的一个示例。
Exception 有一个称为 的子类RuntimeException
,它们通常是表示代码中存在错误的异常,并且通常会在大多数代码中的很多地方发生。示例是NullPointerException
,ArrayIndexOutOfBoundsException
等。这些也未选中,因为您会在代码中乱扔这些捕获物。
编译器会检查所有其他异常,您必须捕获或抛出它们。