[java]从字节码看finally块与return执行顺序

原创 2018年04月17日 13:51:52
java代码:
public int getI() {
    int i = 1;
    try {
        return i;
    } finally {
        i++;
    }
}
字节码(javap -c -l YourClass.class):
public int getI();
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: istore_3
       4: iinc          1, 1
       7: iload_3
       8: ireturn
       9: astore_2
      10: iinc          1, 1
      13: aload_2
      14: athrow
    Exception table:
       from    to  target type
           2     4     9   any
解释:
0: iconst_1              int型常量1进栈
1: istore_1               将栈顶int存入局部变量表位置1(位置0为this)
2: iload_1                int型局部变量(位置1)进栈
3: istore_3              将栈顶int存入局部变量表位置3
4: iinc          1, 1      局部变量表位置1自增1(finally块i++)
7: iload_3               int型局部变量(位置3)进栈

8: ireturn                返回当前操作数栈中的1


finally块会在return之前执行。

【待补充】为什么getI()返回值是1而不是2

从字节码的角度来看try-catch-finally和return的执行顺序

从字节码的角度来看try-catch-finally和return的执行顺序全篇以一个例子来说明:先看如下代码:public class ExceptionTest { public void...
  • u010412719
  • u010412719
  • 2015-11-25 22:47:40
  • 1046

以字节码角度解释return和finally的执行顺序?

前言(Preface): 关于return和finally的执行顺序,算是一个“老梗”了吧,大家众说纷纭,相信很多人已经看过很多版本的解释。但有些人可能只是通过简单的代码测试得出来的结论,没有从根本上...
  • u012557814
  • u012557814
  • 2016-03-01 13:44:49
  • 947

java中finally与return的执行顺序详解

一些准备知识:     首先为了说明白java中finally与return的执行顺序是怎样的这个问题,我们需要做一点准备工作。     java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的...
  • qj19842011
  • qj19842011
  • 2015-05-12 21:16:16
  • 6752

try中return语句与finally语句执行顺序

 在这里看到了try catch finally块中含有return语句时程序执行的几种情况,但其实总结的并不全,而且分析的比较含糊。但有一点是可以肯定的,finally块中的内容会先于tr...
  • lucyxu107
  • lucyxu107
  • 2017-06-14 15:16:02
  • 183

java中异常处理finally和return语句的执行顺序

finally代码块的语句在return之前一定会得到执行 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存,...
  • shihui512
  • shihui512
  • 2016-06-14 19:36:12
  • 2084

Java中finally语句块的深度解析(try catch finally的执行顺序)

首先摆出结论: 1、除了以下2种情况外,不管有木有出现异常,finally块中代码都会执行; ①程序未进入try{}块的执行,如在try之前出现运行时异常,程序终止。 ②程序进入到try{}和c...
  • u014475796
  • u014475796
  • 2016-11-08 22:25:10
  • 962

Java try/catch/finally代码块中加入return后的执行顺序问题

finally可以分两方面理解 1.执行时机问题。finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catch后面执行 2.返回值问题。可以认...
  • PapperMan
  • PapperMan
  • 2016-05-19 19:20:12
  • 592

【Java】try中有return,finally块执行问题

对于如下的一段程序: package try_catch_finally_return; public class TCFRtest { private static void Test1(){...
  • yongh701
  • yongh701
  • 2015-11-26 17:03:26
  • 2933

return语句在try-catch-finally中的执行顺序

return语句在try-catch-finally中的执行顺序,这个问题很早在Q群上听闻,今天结合网上资料以及自己的实践,大体明白了:在try范围执行时抛出异常后,try里面剩余的代码不再执行,直接...
  • chenshizero
  • chenshizero
  • 2010-05-17 21:47:00
  • 764
收藏助手
不良信息举报
您举报文章:[java]从字节码看finally块与return执行顺序
举报原因:
原因补充:

(最多只允许输入30个字)