复习软件构造时涉及到了Checked和Unchecked类型的异常,给出他们的划分和处理准则;
图1:异常类的继承关系,其中Throwable类继承自Object
Error类
Error类描述的是java运行时系统内部出现的错误和系统资源不足的异常情况,比如用户输入错误、设备错误或者物理限制(内存不足等),程序员对于这些内部错误通常是没有办法解决的,一旦发生需要想办法让程序优雅的结束;
图2:Error类
一些典型的Error:
VirtualMachineError:Java虚拟机坏了或者内存不足以支持继续运行
OutOfMemoryError:无法再分配并且垃圾回收程序也不能再提供可用的内存
StackOverflowError:栈移除错误,递归调用很多次会出现
Exception类
程序执行中的非正常事件,是程序导致的问题,可以进行捕获和处理。
Unchecked Exception
这里的检查是面向编译器的,即Unchecked是指编译器无法检查也不会检查的异常,Checked就是编译器再编译时会检查的异常;
Unchecked异常包括运行时异常和Error,由于运行时异常和Error异常都是在编译阶段无法发现的,只有程序运行时才能发现的异常,所以编译器在编译时无法对其进行检查,这类异常是不需要在编译的时候用try catch、throws等机制来处理的,编译可以通过,执行时如果出现就直接导致程序失败;
其中典型的运行时异常有空指针、数组访问越界等,通常是程序的逻辑错误引起的;
Checked Exception
Checked异常是Exception类的子类中除去运行时异常的所有其他异常类,如IO异常,这类异常必须被捕获并进行处理,否则编译就无法通过,异常被捕获之后需要进入异常处理,可以通过thorws、throw、try catch和finall来进行:
throws:声明本方法可能会发生xx异常;
throw:抛出xx异常;
try catch、 finally:捕获并处理异常;
二者对比:
Checked exception | Unchecked exception | |
基本区别 | 必须被显示地捕获或者传递, 否则编译无法通过 | 异常可以不被捕获或抛出, 编译器不检查 |
分类 | 继承自Exception类,除了运 行时异常其他的子类 | 运行时异常及其子类,Error 类 |
处理策略 | 从异常发生的现场获取详细的信息, 利用 异常返回的信息来明确操作 失败的原因, 并加以合理的恢复处理 | 简单打印异常信息,无法再继 续处理 |
表示 | 代码看起来较复杂 | 简单清晰 |
总结:异常可以分类为Unchecked和Checked两种,是针对编译器是否在编译时检查这类异常来讲的,前者包括运行时异常和Error类,都是编译时无法预测的,不需要进行异常处理,编译器可以通过;剩余的Exception子类都是Checked异常,必须使用throw、throws、try catch和finally来捕获并处理,处理一般输出导致错误的原因,并提供恢复的一些操作。
参考文章:哈工大软件构造课件