一、异常分类
从异常处理机制的角度可以分为两类,Unchecked Exceptions和Checked Exceptions。Check即编译器检查程序是否已经抛出或处理了可能的异常。Unchecked Exceptions指的是被程序员check的异常,Checked Exceptions指的是被编译器check的异常。
Throwable下面有两个子类,分别为Error和Exception,其中所有的Error类和Exception类中的RuntimeException类都属于Unchecked异常,其余都属于Checked异常。
二、处理机制
Checked Exceptions可能会发生的地方,编译器会强制要求你要么处理这个异常(try catch块进行处理),要么在这个方法的头部声明这个方法可能会抛出一个异常,对调用这个方法的方法做一个警告,要求调用者来处理这个异常(throws声明)。
Unchecked Exceptions可能会发生的地方,编译器无法预见,因此不要求做任何处理。
一般来说,Checked Exceptions常常是可以捕获捕获并处理的,往往由与客户端的不正确调用引起,捕获异常并处理可以给用户提供一次改正的机会,提高程序的健壮性。例如:用户指定打开文件路径的文件并不存在,因此可以捕获这个异常,做一个提示,并让用户可以重新选择路径。Unchecked Exceptions一般捕获后没有什么价值的,其包含的Error属于系统的内部错误,是由于设备错误,物理限制,内存不足,JVM发生内部错误,不兼容等等原因导致的,因此捕获后没有什么处理价值。另一种RuntimeException则是由于程序员本身代码有错误,发生除零错误,空指针异常,数组越界等等,这种纯粹属于程序员写代码时的失误引起,需要改变程序,因此捕获的价值很低,重写代码找出bug即可。
Checked异常
Checked异常是Exception类的子类中除去运行时异常的所有其他异常类,如IO异常,这类异常必须被捕获并进行处理,否则编译就无法通过,异常被捕获之后需要进入异常处理,可以通过thorws、throw、try catch和finall来进行:
- throws:声明本方法可能会发生xx异常;
- throw:抛出xx异常;
- try catch、 finally:捕获并处理异常。
Unchecked异常
Unchecked异常包括运行时异常和Error,由于运行时异常和Error异常都是在编译阶段无法发现的,只有程序运行时才能发现的异常,所以编译器在编译时无法对其进行检查,这类异常是不需要在编译的时候用try catch、throws等机制来处理的,编译可以通过,执行时如果出现就直接导致程序失败;其中典型的运行时异常有空指针、数组访问越界等,通常是程序的逻辑错误引起的。
三、Checked exception、Unchecked exception二者对比
Checked exception | Unchecked exception | |
基本区别 | 必须被显示地捕获或者传递,否则编译无法通过 | 异常可以不被捕获或抛出,编译器不检查 |
分类 | 继承自Exception类,除了运行时异常其他的子类 | 运行时异常及其子类,Error类 |
处理策略 | 从异常发生的现场获取详细的信息, 利用 异常返回的信息来明确操作失 败的原因, 并加以合理的恢复处理 | 简单打印异常信息,无法再继续处理 |
表示 | 代码看起来较复杂 | 简单清晰 |