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 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))