Java的finally关键字的使用说明
- 2016-04-20 20:51:00
- admin
- 原创 1598
一、finally关键字的使用说明
1、通过插入额外代码和any异常保证finally一定会执行;
2、finally在return之前执行,或者在抛出异常之前执行;
3、finally导致代码膨胀,重新加载寄存器,效率比较低;
二、finally关键字的使用示例
示例代码:Finally.java
public class Finally {
@SuppressWarnings("unused")
public static String myFinally(boolean finReturn) {
try {
int v = 1/1;
if (true)
return "try return!";
} catch(Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally reach!");
if (finReturn)
return "finally return!";
}
return "never return!";
}
public static void main(String[] args) {
System.out.println(myFinally(false));
System.out.println(myFinally(true));
}
}
输出结果:
finally reach!
try return!
finally reach!
finally return!
三、finally关键字的反编译分析
public static java.lang.String myFinally(boolean finReturn);
0 iconst_1
1 istore_1 [v]
2 getstatic java.lang.System.out : java.io.PrintStream [16] //插入点1
5 ldc <String "finally reach!"> [22]
7 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
10 iload_0 [finReturn]
11 ifeq 17
14 ldc <String "finally return!"> [30]
16 areturn
17 ldc <String "try return!"> [32]
19 areturn
20 astore_1 [e]
21 aload_1 [e]
22 invokevirtual java.lang.Exception.printStackTrace() : void [34]
25 getstatic java.lang.System.out : java.io.PrintStream [16] //插入点2
28 ldc <String "finally reach!"> [22]
30 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
33 iload_0 [finReturn]
34 ifeq 58
37 ldc <String "finally return!"> [30]
39 areturn
40 astore_2
41 getstatic java.lang.System.out : java.io.PrintStream [16]
44 ldc <String "finally reach!"> [22]
46 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
49 iload_0 [finReturn]
50 ifeq 56
53 ldc <String "finally return!"> [30]
55 areturn
56 aload_2
57 athrow
58 ldc <String "never return!"> [39]
60 areturn
Exception Table:
[pc: 0, pc: 2] -> 20 when : java.lang.Exception
[pc: 0, pc: 2] -> 40 when : any
[pc: 20, pc: 25] -> 40 when : any
finally代码插入点:
1、try代码的return之前,或者try代码的结束位置;
2、catch代码的return之前,或者catch代码的结束位置;
3、未知异常发生时,比如异常表的二条目和三条目;
异常表分析:
1、异常条目是一个三元组:发生异常的代码区间,异常处理代码的起始位置,何种异常触发该条目;
2、第一个异常条目:try的代码发生Exception异常,则跳转到catch;
3、第二个异常条目:try的代码发生非Exception异常,则跳转到finally,保证finally一定执行;
4、第三个异常条目:catch的代码发生任何异常,则跳转到finally,保证finally一定执行;