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版)

posted @ 2026-04-03 09:10  program_keep  阅读(1)  评论(0)    收藏  举报