finally子句包含return语句的结果分析
1.先说结论:try语句中的值会先计算然后被丢弃(方法结束后),返回的是finally中的值
2.案例分析
2.1 源码
public class FinallyWithReturnTest {
public static void main(String[] args) {
System.out.println(parseInt("10"));
}
public static int parseInt(String s) {
try {
return Integer.parseInt(s);
}finally {
return 0;
}
}
}
2.2 运行结果
0
3. 字节码分析
3.1 编译&反编译
javac FinallyWithReturnTest.java
javap -c FinallyWithReturnTest
3.2 查看字节码(只列出关键代码)
public static int parseInt(java.lang.String);
Code:
0: aload_0
1: invokestatic #6 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
4: istore_1
5: iconst_0
6: ireturn
7: astore_2
8: iconst_0
9: ireturn
Exception table:
from to target type
0 5 7 any
}
3.3 逐行分析
(1)0: aload_0 加载方法参数,即2.1源码中的"10"
(2)1: invokestatic 执行Integer.parseInt()方法
(3)4: istore_1 保存Integer.parseInt()的计算结果10到局部变量
(4)5: iconst_0 加载常量0,即2.1源码中的finally子句中{return 0}的0
(5)6: ireturn 返回int值,即返回0,程序结束
(6)7: astore_2 存储异常信息(对应Exception table(异常表)target 7)
(7)位置8、9仍是finally逻辑(加载常量0并返回)
4. 总结
无论try中是否有异常,finally中的返回值都将成为最终返回值
案例来源:Cay S. Horstmann《Core Java, Volume Ⅰ: Fundamentals》(第12版)
本文来自博客园,作者:program_keep,转载请注明原文链接:https://www.cnblogs.com/program-keep/p/19815373
浙公网安备 33010602011771号