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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 光脚丫的小白兔 中级黑马   /  2013-10-8 21:44  /  1385 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test {

public static void main(String[] args) {
   
   System.out.println(new Test().test());;
}
int test()
{
   try
   {
    return func1();
   }
   finally
   {
    return func2();
   }
}

int func1()
{
   System.out.println("func1");
   return 1;
}
int func2()
{
   System.out.println("func2");
   return 2;
}
}
/*
运行结果是
func1
func2
2
说明finally是在return后执行的,但finally一定会被执行完。*/
class Test {

public static void main(String[] args) {
   
   System.out.println(new Test().test());;
}
static int test()
{
   int x = 1;
   try
   {
    return x;
   }
   finally
   {
    ++x;//x=2
   }
}

}/*
这里的运行结果是  1
finally在return后执行,++x不是2,x指向的是2,为什么是1呢?
中间出现了说明插曲!求大神解释!*/

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

4 个回复

倒序浏览
在程序执行期间,try执行后返回一个结果,这个结果会暂时存放在栈空间,
然后程序继续回来执行finally代码块,所以你第二个程序中虽然finally中有++x,
但是此时返回值已经在栈空间了,不存在指向问题,java中是传值运算。
第一个估计你也知道为什么了,因为你finally中又返回了一个值,将原本的返回值就覆盖掉了。
希望能帮到你,因为我也不是大神,只能理解到这里了。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马戴帅军 于 2013-10-8 22:47 编辑

try中的return的返回值是固定的,只要执行到了这个代码,他就产生了固定的返回值。
finally中是一定会被执行的代码块,这也没有错。但是
finally
   {
    ++x;//x=2
这段代码对x只进行了先+1运算,并没有对x的值进行打印或者return。class Test {

public static void main(String[] args) {
   
   System.out.println(new Test().test());;
}
static int test()
{
   int x = 1;
   try
   {
    return x;
   }
   finally
   {
    ++x;//x=2
    System.out.println("finally:"+x);
   }
}
}
输出的结果是:finally:2
                       1
说明了finally中的代码一定会执行,而且先于try中的return语句。

class Test {

public static void main(String[] args) {
   
   System.out.println(new Test().test());;
}
static int test()
{
   int x = 1;
   try
   {
    return x;
   }
   finally
   {
    ++x;//x=2
    System.out.println("finally:"+x);
    return x;
   }
}
}

输出的结果是finally:2
                     2
在finally中写入return语句以后,会覆盖try中的return语句。
希望对楼主有帮助。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-9 08:44:38
板凳
如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
class Test {

        public static void main(String[] args) {
          
           System.out.println(new Test().test());;
        }
        static int test()
        {
           int x = 1;
           try
           {
                   System.out.println("try中的x:"+x);
            return x;//当程序遇到return时,把 x=1装载到 return这辆车上。准备开走,但是要让finally先开走
           }
           finally
           {
            ++x;// 可是finally把x改变了,(x=2,但是return那辆车上还是装x=1)finally执行完内存里面的值改变,返回的值不变
                   System.out.println("finally中的x:"+x);//x=2
           }
        }
        }

总结:finally先于return执行,但是return返回的是finally执行之前的值。我觉得用上面的小例子比较容易理解。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马