1.问题
- 下面会输出什么
package metaspace;
public class Demo3_12_2 {
public static void main(String[] args) {
int result = test();
System.out.println(result);//20
}
public static int test() {
try {
return 10;
} finally {
return 20;
}
}
}
2.字节码解释
Compiled from "Demo3_12_2.java"
public class metaspace.Demo3_12_2 {
public metaspace.Demo3_12_2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2 // Method test:()I
3: istore_1
4: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iload_1
8: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
11: return
public static int test();
Code:
0: bipush 10 //把10放入栈顶
2: istore_0 //弹出栈顶值,放入slot 0中(slot就是局部变量曹)
3: bipush 20 //开始执行finally中的语句。把20放入栈顶
5: ireturn //ireturn 弹出栈顶数据,返回
6: astore_1 //捕捉finally出现的异常,存入slot 1中
7: bipush 20 //开始执行finally中的语句。把20放入栈顶
9: ireturn //ireturn 弹出栈顶数据,返回
Exception table:
from to target type
0 3 6 any
}
3.注意
从下面的字节码中看到,没有athrow这个字节码(抛出异常)?????
原因:在finally中使用了,return,就会吞掉throw
所以!!!!!!!!
在finally中,千万不要写return
Code:
0: bipush 10 //把10放入栈顶
2: istore_0 //弹出栈顶值,放入slot 0中(slot就是局部变量曹)
3: bipush 20 //开始执行finally中的语句。把20放入栈顶
5: ireturn //ireturn 弹出栈顶数据,返回
6: astore_1 //捕捉finally出现的异常,存入slot 1中
7: bipush 20 //开始执行finally中的语句。把20放入栈顶
9: ireturn //ireturn 弹出栈顶数据,返回