Java中的Checked和Unchecked异常

2022-06-16 12:39:12

复习软件构造时涉及到了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 exceptionUnchecked exception
基本区别

必须被显示地捕获或者传递,

否则编译无法通过

异常可以不被捕获或抛出,

编译器不检查

分类

继承自Exception类,除了运

行时异常其他的子类

运行时异常及其子类,Error

处理策略

从异常发生的现场获取详细的信息,

利用 异常返回的信息来明确操作

失败的原因, 并加以合理的恢复处理

简单打印异常信息,无法再继 续处理
表示代码看起来较复杂简单清晰

总结:异常可以分类为Unchecked和Checked两种,是针对编译器是否在编译时检查这类异常来讲的,前者包括运行时异常和Error类,都是编译时无法预测的,不需要进行异常处理,编译器可以通过;剩余的Exception子类都是Checked异常,必须使用throw、throws、try catch和finally来捕获并处理,处理一般输出导致错误的原因,并提供恢复的一些操作。

参考文章:哈工大软件构造课件

  • 作者:哈工大吴彦祖
  • 原文链接:https://blog.csdn.net/weixin_50928233/article/details/118330442
    更新时间:2022-06-16 12:39:12