try中有return语句 finally中的语句还会执行
总结:
- try中有return语句 语句中的值会保存在本地变量中 无论 finally中对该值做什么处理 都会返回try中的值
- try和finally中都有return 语句 会忽略try中的return 语句
- 特殊情况 如果说 返回值是一个引用对象 最后一个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 语句的执行顺序:
- 首先执行其他部分的expression 表达式
- 将这个表式的返回值从操作数栈顶 复制一份到局部变量区作为返回值
- 执行finally中的语句块
- 将局部变量区中的值复制回操作数栈顶
- 返回操作数栈顶中的值
可以看出 返回什么值在第一步执行完之后就定了 只是为了执行finally中的语句 腾出操作数栈中的空间 将返回值从栈顶复制了一份到局部变量中
所以在finally中修改返回值是无效的 因为finally中修改的只是操作数栈顶复制到 局部变量区中的快照 而不是真正的返回值
但当finally中有return语句时 返回的就是新的操作数栈中的栈顶数据 而不是复制到局部变量区用作返回值的快照 所以这时 是有效的return