首先来看一段代码
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,通过现象看本质。