jvm如何处理异常

2018-10-30  本文已影响0人  杨殿生

异常分类

抛出异常

显示

throw手动抛出y异常

隐示

java虚拟机碰到无法继续执行的异常状态,自动抛出异常

捕获异常

try 标记进行异常监控代码
catch 针对该异常的处理结果
finally 声明一段必定执行的代码

异常基本概念

Throwable
Exception 检查异常
RuntimeException 非检查异常
Error 非检查异常

检查异常

检查异常的构造十分昂贵。在构造检查异常时,java虚拟机便要生成该异常的栈轨迹。该操作会逐一访问当前线程的java栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名,文件名,以及代码中的第几行触发该异常

java虚拟机如何捕获异常

在编译成的字节码中,每一个方法都附带一个异常表,异常表中的每一个条目代表一个异常处理器,并且由from、to、target指针以及所捕获的异常类型构成
当程序触发异常时,java虚拟机会从上之下遍历异常表中的所有条目。当触发异常的字节码的索引值在某个异常条目的监控范围内,java虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。如果匹配,java虚拟机会将控制流转移至该条目target指针指向的字节码
如果遍历完所有的条目,java虚拟机仍然未匹配到异常处理器,那么它会弹出当前方法对应的java栈帧,并且调用者中重复上述操作。在最坏的情况下,java虚拟机需要遍历当前栈程java栈上的所有方法的异常表
finally是赋值代码块的内容,分别方在太try-catch代码块所有正常执行路径以及异常执行路径的出口中

上一篇 下一篇

猜你喜欢

热点阅读