Java的finally关键字的使用说明

2016-04-20 20:51:00
admin
原创 1598
摘要:Java的finally关键字的使用说明

一、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一定执行;

发表评论
评论通过审核之后才会显示。