Java finally块修改返回变量为何无效:实际返回6预期为5
Java finally块修改变量不生效原因说明
这是Java方法返回机制的固有特性,具体逻辑如下:
- 当
try代码块执行到return n语句时,JVM会先将当前局部变量n的值(此时为6)拷贝一份,存入专门的返回值缓冲区,相当于提前锁定了最终要返回的结果。 - 之后才会执行
finally代码块的逻辑,你在finally中修改的只是栈上存储的局部变量n本身,不会影响已经存入缓冲区的返回值副本。 - finally代码块执行完成后,JVM会直接将缓冲区中存储的6返回,因此最终得到的结果不是你预期的5。
如果需要让finally块的修改生效,可以直接在finally块中编写return语句,覆盖之前的返回值缓冲区内容:
public static int p() { int n = 0; try { n = 6 ; return n; } catch (Exception e) { return n; } finally { n = 5; return n; } }
补充说明:如果方法返回的是引用类型对象,finally块中修改该对象的内部属性是会生效的——因为返回值缓冲区存储的是对象的引用副本,和原局部变量指向堆中的同一个对象,修改对象属性不会改变引用地址,因此会生效。只有基本类型的赋值、或者给引用变量重新赋值新对象的操作,不会影响已存储的返回值。
内容的提问来源于stack exchange,提问作者Yallaling Kolkur
相关产品推荐
相关产品推荐

