为什么Java中的运行时exception“未经检查”?

为什么运行时exceptionUnChecked是有意义的 (而不是如果它们被检查 )?

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

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

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

我必须检查ClassCastExceptionArrayIndexOutofBoundsExceptionArithmeticExceptionUnsupportedOperationExceptionNullPointerException

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

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

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

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

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

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

在Java中对这个function提出了一些批评,有些人甚至将检查过的exception称为失败的实验 ,有些人建议从Java中删除已检查的exception 。

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