You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:15:01