Java中return和finally到底哪个先执行

本文通过实例代码和字节码分析,详细探讨了在Java中return语句与finally块的执行顺序。结论是:当return后面带有表达式时,会先执行表达式,然后执行finally块,最后执行return指令。对于不同情况下的x值变化,关键在于return前的值保存位置,而不是谁先执行。
摘要由CSDN通过智能技术生成

}

}

}

输出

1

上述代码的输出可以简单地得出结论:return在finally之前执行,我们来看下字节码层面上发生了什么事情。下面截取case1方法的部分字节码,并且对照源码,将每个指令的含义注释在后面:

0: iconst_1 // 将常量1推入操作数栈顶

1: istore_0 // 弹出栈顶元素(1),保存到局部变量表slot[0],此时slot[0]=1。这两条指令对应源码:x = 1;

2: iload_0 // 将局部变量表slot[0]的值推入操作数栈顶,也就是说把上面x的值推入栈顶

3: istore_1 // 弹出栈顶元素(1),保存到局部变量表slot[1],此时slot[1]=1。其实,此时就已经把要return的值准备好了

4: iconst_3 // 将常量3推入操作数栈顶,这一条指令开始,其实是开始执行finally中的代码了

5: istore_0 // 弹出栈顶元素(3),保存到局部变量表slot[0],此时slot[0]=3。这两个指令对应源码:x = 3;这里要注意的是,虽然都是更新了x的值,但是finally中的x和try中x的赋值,保存在了不同的局部变量表中

6: iload_1 // 将局部变量表slot[1]的值推入操作数栈顶,此时栈顶元素的值为1,是第3行指令保存的值

7: ireturn // 将操作数栈顶的值返回给调用方

从字节码来看,似乎又是finally的代码先执行了,因为ireturn指令确实是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值