深入拆解虚拟机(六)JVM是如何处理异常的?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwl2014100338/article/details/84196491
抛出异常

(1)显式抛异常的主体是应用程序,它指的是程序中使用’'throw "关键字,手动将异常实例抛出

(2)隐式抛异常的主体是Java虚拟机,它指的是Java虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常


捕获异常

(1)try代码块:用来标记需要进行异常监控的代码

(2)catch代码块:跟在try代码块之后,用来捕获在try代码块中触发的某种指定类型的异常。除了声明所捕获异常的类型之外,catch代码块还定义了针对该异常类型的异常处理器。在java中,try代码块后面可以跟着多个catch代码块,来捕获不同类型的异常。JAVA虚拟机会从上至下匹配异常处理器。因此,前面的catch代码块所捕获的异常不能覆盖后面的,否则编译器会报错

(3)finally代码块:跟在try代码块和catch代码块之后,用来声明一段必定运行的代码。它的设计初衷是为了避免跳过某些关键的清理代码,例如关闭已打开的系统资源

(4)try代码块触发异常的情况下,如果该异常没有被捕获,finally代码会直接运行,并且在运行之后重新抛出该异常

(5)在某些不幸的情况下,catch代码块也触发了异常,那么finally代码块会运行,并会抛出catch代码块触发的异常。在某些极端不幸的情况下,finally代码块也触发了异常,那么只好中断当前finally代码块的执行,并往外抛异常


异常基本概念

(1)在Java语言规范中,所有异常都是Throwable类或者其子类的实例。Throwable有两大直接子类。第一个是Error,涵盖程序不应捕获的异常。当程序触发Error,它的执行状态已经无法恢复,需要中止线程甚至是终止虚拟机。第二类则是Exception,涵盖程序可能需要捕获并且处理的异常

(2)Exception又分为RuntimeException和其他类型。RuntimeException和Error属于非检查异常。其他Exception属于检查异常,在触发时需要显式捕获,或者在方法头用throws关键字声明


Java虚拟机是如何捕获异常的?

(1)Java字节码中,每个方法对应一个异常表。当程序触发异常时,Java虚拟机将查找异常表,并依此决定需要将控制流转移到哪个异常处理器之中。Java代码中的catch代码块和finally代码块都会生成异常表条目


猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/84196491