为什么让 Runtime Exceptions UnChecked 有意义(而不是Checked)?
3 回答
如果您不这样做,则每次访问数组元素、执行除法操作和许多其他常见场景时都必须使用 try/catch 块。
换句话说,想象一下这段代码:
Map map = ...
int i = ...
(int[])map.get("foo")[3] = 2334 / i;
将不得不检查我的头顶上的ClassCastException
, ArrayIndexOutofBoundsException
, ArithmeticException
,UnsupportedOperationException
和。NullPointerException
对于 Java,问题不在于未经检查的异常。检查异常是一个极具争议的话题。有人说这主要是对 Java 的一次实验,实际上它们不起作用,但你会发现很多人认为它们很好。
然而,没有人认为未经检查的异常是不好的。
Java 中的两种异常(已检查和未检查)的想法是,已检查异常应用于可以合理预期发生的错误情况,未检查异常应用于意外错误情况。
例如,如果找不到文件,您会得到一个FileNotFoundException
,并且期望您的程序能够处理这种情况是合理的。未经检查的异常应该只用于不应该发生的问题,这实际上意味着如果发生这样的问题,程序中就会存在错误。例如,aNullPointerException
表示您的程序正在尝试取消引用一个变量,该变量null
很可能是一个错误。
Java 编译器强制程序员处理已检查的异常。这使编程语言更安全——这意味着程序员被迫考虑错误条件,这应该使程序更加健壮。
The compiler doesn't check unchecked exceptions, because unchecked exceptions aren't supposed to happen anyway and if they do, there's nothing that the program could reasonably do at runtime; the programmer must solve the bug.
There has been some criticism to this feature in Java, some people even call checked exceptions a failed experiment and some people propose to remove checked exceptions from Java.
这仅仅意味着编译器不会强迫你寻找异常,但你仍然可以在运行时抛出它。作为一个好处,这允许你从你的类中抛出新的异常,而不需要你改变你的接口,导致调用者改变他们的代码。