黑马程序员技术交流社区

标题: finally 问题 [打印本页]

作者: 张志明    时间: 2014-1-10 19:15
标题: finally 问题
本帖最后由 张志明 于 2014-1-11 20:32 编辑

public classTest {
    public static voidmain(String[] args) {
      
       System.out.println(newTest().test());;
    }

    static int test()
    {
       int x = 1;
       try
       {
           returnx;
       }
       finally
       {
           ++x;
       }
    }
   
}
为什么输出结果是1啊 不是finally先与return执行啊

作者: xu6148152    时间: 2014-1-10 19:21
在return x的时候,x的值被放到了方法的返回内存区域中。finally后续的操作不会影响这个内存区域。
最终函数执行,这块内存区域的值被返回。因此是1.

作者: 路西法    时间: 2014-1-11 20:03
你在++x后面加上return x;就能得到你想要的结果了。


系统执行try里面的return之后还没有返回返回值就执行finally
系统在执行完finally后没有return,就会回去返回try里面的return的返回值
如果finally里面有return,则直接返回finally里的返回值并且结束。不会再去返回try里面的返回值了


作者: 张志明    时间: 2014-1-11 20:25
路西法 发表于 2014-1-11 20:03
你在++x后面加上return x;就能得到你想要的结果了。

谢谢你~~
作者: 淡夜清风    时间: 2014-1-11 20:25
本帖最后由 淡夜清风 于 2014-1-11 20:27 编辑

在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。它应该使用栈保存返回值(可以理解为finally语句是在return语句后执行的,return语句实现并不是马上返回主函数,而是等执行完finally语句后返回)
如果finally里面还有return 值,则try里面的return值,最终会被finally里的return值所覆盖。--------------
例子1:
public class FinallyTest {
        public static void main(String[] args) {
                System.out.println(FinallyTest.test());
        }

        static int test() {
                int x = 8;
                try {
                        System.out.println("before return" + x);
                        return x;
                } finally {
                        System.out.println("before finally" + x);
                        ++x;
                        System.out.println("after finally" + x);
                }
        }
}
输出结果:
before return8
before finally8
after finally9
8
-------------------
例子2:
public class FinallyTest {
        public static void main(String[] args) {
                System.out.println(FinallyTest.test());
        }

        static int test() {
                int x = 8;
                try {
                        System.out.println("before return" + x);
                        return x;
                } finally {
                        System.out.println("before finally" + x);
                        ++x;
                        if(x>8)
                                return x;
                        System.out.println("after finally" + x);   
                }
        }
}
输出结果:
before return8
before finally8
9



作者: 张志明    时间: 2014-1-11 20:34
淡夜清风 发表于 2014-1-11 20:25
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去 ...

很详细。我试过了 ,  谢谢你
作者: 路西法    时间: 2014-1-11 20:58
淡夜清风 发表于 2014-1-11 20:25
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去 ...

看了你这2个例子感觉很好    我有个疑问    finally中有return时,系统是返回它的值之后就结束不管try中的返回值了   还是它的返回值把try中return的返回值给覆盖了  2中输出的结果都是一样的  
作者: tf996268809    时间: 2014-1-11 21:00
不是finally先与return执行,是按照程序步骤执行,只不过finally是必须执行,
作者: 午夜b'Boy    时间: 2014-1-11 21:31
如果x是引用型变量呢,并且finaly中对此变量的字段进行修改结果是?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2