第6章的第二部分主要是对checked和unchecked类型的异常进一步分析。
二者之间的主要区别如下图。
首先,有一部分的异常会被处理(handle),而执行这一步骤的就是编译器,还有程序员。
当一个异常产生时,可以有两种方式来处理。第一种就是我们的程序本身能使用try-catch块来捕获并解决异常;而第二种情况,即程序无法独立解决时,我们就要将其抛出,表明我们无法处理,请求调用方来处理这个异常。每一个异常都能且只能对应这两种处理方式。如果我们既无法捕获,处理异常,又不将其抛出以告知调用者,就会产生错误。编译器可以帮我们检查程序是否抛出或者处理了可能的异常。
当我们决定是采用checked还是unchecked异常的时候,有一个判据很重要,即:如果该异常真的被抛出了,客户(client)会做出怎样的补救呢?这里又分成了两种情况。如果client有办法恢复这个异常,就可以用checked;反之,就设为unchecked。
对于一个异常,如果是unchecked,就挂起程序并返回异常信息,简单地告诉其他人“有错!”即可。而由于这些异常是client也无法掌控的,不必告知他人错误在哪里;若是checked类型的,则要创建一个单独的子类来应对这种异常,并且要尽量让client从这个异常中获取尽量多的有价值的内容—案发现场具体是什么样子(这也是Exception应该做到的本职工作)。
总之,checked异常指的是那些可预料但不可预防的异常(也就是说,我知道这些地方保证会有错误产生,但我也不知道具体是什么错误);而unchecked异常指的就是那些能够预防的异常,当然这是建立在每个程序员在release自己的代码时做出的“自己的代码是无误的”的假设上的。毕竟,一个摆明了自己有缺陷而又不愿意在release之前改正过来的代码,纯属是在掩耳盗铃,很难被人接受。
对于之前已经提到过的异常处理时涉及的5个关键词,将在下一个部分中具体分析。个人水平有限,不足之处还望见谅!