try-finally【面试题】

首先来看一段代码

public String method111() {
    String ret = "hello";
    try {
return ret;
    } finally {
        ret = "world";
    }
}

最终返回什么呢?可能你知道,但是相信有一部分人是懵了的,因为我们都知道try-finally代码中finally模块最终一定会执行。下面咱们通过java字节码指令来看看到底发生了什么。

首先找到.class文件,然后执行

javap -verbose Test.class >tt.tx

然后保存到tt.txt文件中

 public java.lang.String method111();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=4, args_size=1
        0: ldc           #2 //把常量池中的常量压到操作数栈里// String hello
        2: astore_1      //然后存到本地变量1中
         3: aload_1       //加载本地变量1到操作数栈
         4: astore_2      //再把它保存到本地变量2中
         5: ldc           #3 //把常量池中的常量压到操作数栈里// String world
        7: astore_1      //然后存到本地变量1中
         8: aload_2       //加载本地变量2到操作数栈
         9: areturn       //返回栈里的数据 hello 因为本地变量保存的是hello
        10: astore_3
        11: ldc           #3                  // String world
        13: astore_1
        14: aload_3
        15: athrow
      Exception table:
         from    to  target type
             3     5    10   any
      LineNumberTable:
        line 7: 0
        line 9: 3
        line 11: 5
        line 9: 8
        line 11: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  this   Lcom/u2jinfu/com/requestbank/controller/Test;

3 13 1 ret Ljava/lang/String;

.....其他部分省略

由字节码指令可以看出,显示把hello保存到本地变1和本地变量2中。后面返回的是本地变量2,所以返回的就是hello,通过现象看本质。

Java字节码指令可以参考官方的,也可以参考一个中文翻译的:

https://www.cnblogs.com/longjee/p/8675771.html


猜你喜欢

转载自blog.51cto.com/10983206/2563816