博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
try中有return语句 finally中的语句是否还会执行
阅读量:2456 次
发布时间:2019-05-10

本文共 823 字,大约阅读时间需要 2 分钟。

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

转载地址:http://lenhb.baihongyu.com/

你可能感兴趣的文章
美国正在丢掉非洲数字市场_即插即用服务器可访问非洲数百万个数字文档
查看>>
openstack做安卓_我们是我们为OpenStack做出的贡献
查看>>
为什么从SparkFun而不是Bigbox卖家购买?
查看>>
使用TurnKey Linux的用户友好型虚拟主机
查看>>
开源实时数据库_实时应用程序的开源数据库
查看>>
64 位文件共享锁定数溢出_一位教授如何通过共享教科书为学生节省数百万美元
查看>>
网络虚拟化 软件定义网络_软件定义网络简介
查看>>
组织学习:DevOps的新视角
查看>>
openstack项目_沃尔玛的OpenStack,项目改革现状等
查看>>
unity 作弊_屏幕作弊没问题,Unity打开,等等
查看>>
推动互操作性,OpenStack卡座等
查看>>
linkedin开源列表_Google的新容器项目,LinkedIn上的开源代码,Raspberry Pi B +,等等
查看>>
openstack项目_软件定义的经济,OpenStack的新孵化项目等
查看>>
git项目中的子git项目_使用子模块和子树管理Git项目
查看>>
sh脚本和bash脚本_使用此简单的Bash脚本在家打印双面文档
查看>>
raspberry pi_使用Raspberry Pi构建感知假肢
查看>>
raspberry pi_一个方便的实用程序,用于创建Raspberry Pi SD卡图像
查看>>
盲打每分钟资源10几个字_每个系统管理员应了解的10个资源
查看>>
横向扩展基础架构_您应该使用的7种基础架构性能和扩展工具
查看>>
bbc 王超_BBC Microbit入门
查看>>