赞
踩
答:
在编译生成的字节码中,每个方法都附带一个异常表。异常表中的每一个条目代表一个异常处理器,并且由 from 指针、to 指针、target 指针以及所捕获的异常类型构成。这些指针的值是字节码索引(bytecode index,bci),用以定位字节码。
其中,from 指针和 to 指针标示了该异常处理器所监控的范围,例如 try 代码块所覆盖的范围。target 指针则指向异常处理器的起始位置,例如 catch 代码块的起始位置。
当异常发生时,JVM会去遍历异常表中的所有条目,如果发现异常发生的位置在某个条目的from-to的范围内,那么就会对比抛出的异常和捕获的异常是否一致。如果一致跳转到target指针指向的异常处理器的起始位置执行。一旦该方法的异常表没有找到,则会在弹出该方法对应的栈帧,对调用该方法的方法执行同样的处理。
最坏的情况就是遍历整个线程栈也没有匹配的异常。
(1)通过Code对应字节码内容,可以看出,finally代码块在各种可能得分支下都复制了1份(冗余设计),不出异常的情况,总是会被执行到;
(2)从异常表中可以得出,出现异常,先跳转到catch里执行,catch执行完后,在跳转到finally里执行。所以 finally总是会被执行。
举例:
首先从异常表中可以看出,0~4(不包括4)范围内发生异常则立即跳转到7位置处理异常;另外0 ~4(try块)范围无论发生异常,必须转向15的位置执行finally块中的代码;另外7 ~12(catch块)范围内无论是否发生异常,也必须转向15的位置执行finally块。
3、请简述JVM运行时数据区的组成结构及各部分作用?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。