我对于 checked exception 与 unchecked exception 的理解

AUTHOR | nicechi
类别 | Java
发表 | 2020-08-25 11:06:04
更新 | 2020-08-26 08:56:47

Exception 在 Java 中又被分为 checked exception(检查型异常)以及 unchecked exception(非检查型异常),而 unchecked exception 又被称之为 runtime exception(运行时异常),因为所有继承了 RuntimeException 类的异常都是 runtime exception。

我觉得 checked exception 与 unchecked exception 唯一的区别就是(抛开那些使用场景等的因素来讲),checked exception 必须得使用 try-catch 来捕获与处理,或者使用 throws 将异常向外抛出,否则编译的时候将会报错。而 unchecked exception 就不用这么麻烦了,只要在异常会抛出的时候使用 try-catch 进行捕获处理就可以了。

我对 checked exception 的理解

很多权威的文档都差不多提到 checked exception 的使用场景为:

use checked exception for conditons from which the caller can reasonably be expected to recover

说实话这句话对于我来说比较地抽象,我主要疑惑的点是什么样的报错的场景才能被称之为可以恢复的?

因为不管是 checked exception 还是 unchecked exception ,主要就是采用 try-catch 进行捕获处理。假设某段代码抛出了个 NullPointerException ,那我用 catch 进行处理,并让程序得以继续运行,这种情况不也算是可以恢复的情况吗?那为什么 NullPointerException 却是一个 unchecked exception 呢?

我个人认为所谓的 “ conditons from which the caller can reasonably be expected to recover ” 是指:某个代码因为需要去调用那些与代码建立起联系的外部事物(如访问或操作系统上的文件,即 IO 流,或者说要去连接某个数据等)而导致的错误,所以说去恢复那些不是由代码本身而是由外部事物所导致的错误就可以使用 checked exception。                             

另一方面,因为 checked exception 最主要的特点就是不管 checked exception 会不会抛出,都必须得用上 try-catch。所以说,在这种情况下,checked exception 就是用来主动地去告诉使用者, 这段代码或者说这个方法可能会抛出一个异常来。这样就避免了当使用者在正常调用或者说在正确地按照步骤去调用某个 API 的时候,仍然会抛出某个事先完全没有做好心理准备的异常的情况。

我的理解是,checked exception 是用来抛出来给 API 的使用者看的,然后使用者根据自己的实际情况去处理,而 unchecked exception 是程序员自己在编写的过程中需要自己去注意,自己去捕获和处理的。

我对 unchecked exception 的理解

我比较认可的 unchecked exception 的解释为:

Runtime exceptions represent problems that are the result of a programming problem, and as such, the API client code cannot reasonably be expected to recover from them or to handle them in any way.

也就是说,unchecked exception 表示的是编程上的错误,这个错误是由于违法了编程语言的要求所导致的。之所以 unchecked exception 不要求一定要 try-catch,是因为编程错误是随时随地都可能会发生的,或者说每一行代码都有可能会发生 unchecked exception,可能我一不小心对一个空对象进行了操作,又或者我一不小心访问了一个超出数组长度的元素,如果说必须得对 unchecked exception 进行 try-catch 的话,那可能代码上到处都得是 try-catch 了。

之所以说 unchecked exception " cannot reasonably be expected to recover from them or to handle them in any way ",我认为是因为当一个 API 抛出 unchecked exception 的话,这代表着 API 本身的代码是有问题的(或者说程序本身的设计上就有缺陷),而 API 的使用者是没有办法修改 API 的源代码的,因为 API 本身是已经编译好了的。

目前我个人是比较喜欢 unchecked exception,因为 checked exception 必须得使用 try-catch ,这意味着有时候我不得已不在已经编好的代码里插入个 try-catch ,可能会比较影响心情吧?虽然说我可以把异常抛给统一异常处理去处理,但是还得加个 throws,还是有一种被迫的感觉吧?


CATEGORY

TOP