以如下代码为实例
public static void main(String[] args) {
try {
A();
}catch (RuntimeException e){
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
public static void A(){
System.out.println("A");
int i = 1 / 0;
}
使用jclasslib查看字节码
黄色框内为finally语句对应的字节码,可以看到其一共出现了三次。
如果方法A未出现异常,程序将顺序执行至11行,然后跳转到41行结束。
如果方法A出现异常,根据下面的异常表,将跳转至14行,执行至27行然后跳转到41行结束。
如果catch语句并未成功捕获此异常,根据异常表将跳转至30行,然后至40行抛出异常最后结束。
可以看到,每条分支最终都将会执行到finally中的代码。
异常表
这就是try catch finally语法糖在字节码层面的原理。