Bruceli4
2017-02-20 16:39
采纳率: 100%
浏览 1.2k
已采纳

Java的捕获异常问题 try finally

public class Test {

/**
 * @param args add by zxx ,Dec 9, 2008
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println(new Test().test());
}

static int test()
{
    int x = 1;
    try
    {
        return x;
    }
    finally
    {
        ++x;
    }
}

}
运行结果是:1

不是说finally在return之前执行吗?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • threenewbee 2017-02-20 17:12
    已采纳

    finally是先执行,但是返回的是之前x,因为x作为返回值已经放在计算栈上了。所以不要在finally写side effect的代码

    打赏 评论
  • 谬词客 2017-02-20 17:03

    …你自己试过也应该知道,try里面有return,则finally会在return后执行。

    打赏 评论
  • 战在春秋 2017-02-20 22:14

    Java中try-catch-finally(或者try-finally)结构的执行顺序是:

    try块先执行,如果抛出异常,相应catch块执行,finally块总是最后执行

    题中代码执行顺序如下:

    1 进入try块
    2 设置函数返回值为1
    3 进入Finally块
    4 自增x.
    5 退出函数,并返回之前设置的返回值1

    return语句也是表达式语句,其值(即函数的返回值)在第2步已经确定。

    打赏 评论
  • 毕小宝 2017-02-21 00:53

    Java在执行finally之前,会记录try或者catch分支中需要返回值的地址,然后执行finally分支,最后才是return那个地址的值。
    所以,Java编译器会建议不要在finally里面操作返回值,因为会对影响真实的返回值的。

    打赏 评论
  • 自己Debug看,就知道了嘛,最终如二楼所说!

    打赏 评论

相关推荐 更多相似问题