A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张志明 中级黑马   /  2014-1-10 19:15  /  1232 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张志明 于 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执行啊

8 个回复

正序浏览
如果x是引用型变量呢,并且finaly中对此变量的字段进行修改结果是?
回复 使用道具 举报
不是finally先与return执行,是按照程序步骤执行,只不过finally是必须执行,
回复 使用道具 举报
淡夜清风 发表于 2014-1-11 20:25
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去 ...

看了你这2个例子感觉很好    我有个疑问    finally中有return时,系统是返回它的值之后就结束不管try中的返回值了   还是它的返回值把try中return的返回值给覆盖了  2中输出的结果都是一样的  
回复 使用道具 举报
淡夜清风 发表于 2014-1-11 20:25
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去 ...

很详细。我试过了 ,  谢谢你
回复 使用道具 举报
本帖最后由 淡夜清风 于 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


回复 使用道具 举报 2 0
路西法 发表于 2014-1-11 20:03
你在++x后面加上return x;就能得到你想要的结果了。

谢谢你~~
回复 使用道具 举报
你在++x后面加上return x;就能得到你想要的结果了。


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

回复 使用道具 举报
在return x的时候,x的值被放到了方法的返回内存区域中。finally后续的操作不会影响这个内存区域。
最终函数执行,这块内存区域的值被返回。因此是1.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马