Haisen大王 2015-09-11 16:58 采纳率: 50%
浏览 1964
已采纳

一个值得深思的问题。

 public class FinallyTest {
    public int test() {
        int i = 0;
        try {
            i++;
            return i;
        } finally {
            i--;
        }
    }
    public static void main(String[] args) {
        System.out.println(new FinallyTest().test());
        ;
    }
}

碰到一个问题:
自己分析: finally块应该是在return之前执行吧。
Debug调试发现,当执行到return i;时,下一步执行 finally块。
然后 到 return i;这行。i的值虽然i--了,但还是没执行finally块前的值。。
表述可能不清,可运行下看看。
我有点不明白其中的执行过程。

  • 写回答

5条回答 默认 最新

  • threenewbee 2015-09-11 17:32
    关注

    是这样的,函数的返回值是return i;决定的。注意,这里return i;其实是对i求值之后记录下返回值,在函数返回的时候返回。
    固然i--;会改变i,但是返回值此时已经确定了。

        public int test() {
            int i = 0;
            try {
                i++;
                return i;
            } finally {
                i--;
                return i;
            }
        }
    

    这样写返回0,因为返回值被再次刷新了。
    你可以把return il看成如下代码
    [result] = i;
    [result]是一个编译器产生的隐含变量
    你的程序其实是

     public int test() {
            int i = 0;
            try {
                i++;
                [result] = i;
            } finally {
                i--;
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?