为什么Java中的运行时异常“未选中”?

时间:2009-11-01 04:19:25

标签: java runtime checked-exceptions

为什么运行时异常未检查(而不是已检查)是否有意义?

3 个答案:

答案 0 :(得分:17)

如果不这样做,则每次访问数组元素时都必须使用try / catch块,执行除法操作和许多其他常见方案。

换句话说,想象一下这段代码:

Map map = ...
int i = ...
(int[])map.get("foo")[3] = 2334 / i;

必须在我的头顶检查ClassCastExceptionArrayIndexOutofBoundsExceptionArithmeticExceptionUnsupportedOperationExceptionNullPointerException

使用Java时,问题不是未经检查的异常。被检查的例外是一个备受争议的主题。有人说这主要是用Java进行的实验,在实践中它们不起作用,但你会发现很多人认为它们很好。

没有人认为未经检查的例外很糟糕。

答案 1 :(得分:8)

Java中的两种异常(已检查和未检查)的想法是,已检查的异常应用于可合理预期会发生的错误情况,未经检查的异常应用于意外错误情况。

例如,如果找不到文件,则会得到FileNotFoundException,并且期望您的程序能够处理这样的情况是合理的。未经检查的异常应仅用于不应发生的问题,这实际上意味着如果发生此类问题,程序中存在错误。例如,NullPointerException表示您的程序正在尝试取消引用null的变量,而这很可能是一个错误。

Java编译器强制程序员处理已检查的异常。这使得编程语言更安全 - 这意味着程序员不得不考虑错误条件,这应该使程序更加健壮。

编译器不会检查未经检查的异常,因为无论如何都不应该发生未经检查的异常,如果这样做,程序在运行时可以合理地执行任何操作;程序员必须解决这个错误。

在Java中对这个功能提出了一些批评,有些人甚至从Java调用了已检查的异常a failed experiment和一些人propose to remove checked exceptions

答案 2 :(得分:1)

这只是意味着编译器不会强制您查找异常,但仍可以在运行时抛出它。作为一个好处,这允许您从类中抛出新的异常,而不需要您更改接口,从而导致调用者更改其代码。