我尝试了以下代码:
class testingFinally {
public static String getMessage() {
String s = "hi";
try {
return s;
} finally {
s = null;
}
}
public static void main(String a[]) {
System.out.println(getMessage());
}
}
输出很明显 "hi"
。但是当我使用 来查看字节码时javap -v
,我得到了以下信息。
public static java.lang.String getMessage();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=0
0: ldc #16 // String hi
2: astore_0
3: aload_0
4: astore_2
5: aconst_null
6: astore_0
7: aload_2
8: areturn
9: astore_1
10: aconst_null
11: astore_0
12: aload_1
13: athrow
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 s Ljava/lang/String;
表中仅显示了一个局部变量,其中使用了 3 个局部变量(0、1、2 校验字节码load
和store
指令)。有对此的解释吗?是否忽略值为 null(最终值)的局部变量?