try中有return语句 finally中的语句是否还会执行

try中有return语句 finally中的语句还会执行
总结:

  1. try中有return语句 语句中的值会保存在本地变量中 无论 finally中对该值做什么处理 都会返回try中的值
  2. try和finally中都有return 语句 会忽略try中的return 语句
  3. 特殊情况 如果说 返回值是一个引用对象 最后一个return 语句 返回的仅仅是引用对象的地址。若finally语句中对该对象的值有修改还是会生效的。
    总结: 最后一个执行的return语句生效,其返回值在执行相应return语句时就被确定(只是,这里确定的是引用)。

参考文章:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5

知识储备:
return x; 执行的过程
x是一个表达式 x计算完成后 将要返回的值 从方法执行的栈帧的局部变量区中复制一个副本放到操作数栈顶 最终返回会返回操作数栈顶这个值 (即复制过来的副本 而不是返回局部变量中这个值的本身)。

try中有 return expression ,finally 语句的执行顺序:

  1. 首先执行其他部分的expression 表达式
  2. 将这个表式的返回值从操作数栈顶 复制一份到局部变量区作为返回值
  3. 执行finally中的语句块
  4. 将局部变量区中的值复制回操作数栈顶
  5. 返回操作数栈顶中的值
    可以看出 返回什么值在第一步执行完之后就定了 只是为了执行finally中的语句 腾出操作数栈中的空间 将返回值从栈顶复制了一份到局部变量中
    所以在finally中修改返回值是无效的 因为finally中修改的只是操作数栈顶复制到 局部变量区中的快照 而不是真正的返回值
    但当finally中有return语句时 返回的就是新的操作数栈中的栈顶数据 而不是复制到局部变量区用作返回值的快照 所以这时 是有效的return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值