为什么Java中的两个异常类型名为“checked”和“unchecked”?这些名字背后的原因是什么?
答案 0 :(得分:12)
如果你调用一个被声明为抛出 checked 异常的方法(例如IOException
),编译器将检查你是否正在捕获它或声明你重新抛出它。同样,为了首先抛出这样一个检查过的异常,编译器检查你已经将它声明为方法签名的一部分。
基本上,它有点像类型检查,除了可以通过方法抛出异常。
编译器不会对未经检查的异常执行任何检查 - 因此可以通过任何方法抛出它们,而不会使用声明它们的方法。
答案 1 :(得分:3)
Java编译器检查已检查的异常:它检查您是否捕获它们或在方法签名中声明它们。
答案 2 :(得分:2)
“已检查”表示您要么必须捕获它,要么声明您的方法将其抛入签名中。方法的用户必须捕获已检查的异常。如果不这样做将导致编译器错误。
“未选中”表示您和方法的用户都不需要捕获异常。您不需要在方法签名中的throws子句中声明它。
在最早的版本中,Java经常选择第一个。
C#将未经检查的异常作为默认值。 Java开发人员现在也采用了这种惯例。
答案 3 :(得分:1)
在Java中,您可以抛出任何Throwable
。 Throwable有两个子类:Error
和Exception
。当抛出Error
时,出现了一个严重的问题,通常与您的代码关系不大。编译器不会检查此类异常,并且是未经检查的异常的示例。
Exception有一个名为RuntimeException
的子类,这些子类通常是指示代码中的错误的异常,并且通常可以在大多数代码中的许多地方出现。示例包括NullPointerException
,ArrayIndexOutOfBoundsException
等。这些也是未经检查,因为您会抓住这些代码而丢弃代码。
检查所有其他异常,因为编译器必须捕获或抛出它们。