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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张玉建 中级黑马   /  2013-8-7 11:27  /  2156 人查看  /  5 人回复  /   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 收起 理由
Sword + 1

查看全部评分

5 个回复

倒序浏览
try语句块中有return语句,会将返回值传递给try所在的函数,但是函数并不会马上就结束,因为finally里面的语句还要继续执行,所以:
1.第一种情况,首先执行try里面的语句,并将返回值1传递给test函数,函数未立即结束,继续执行finally中的语句,finally中还有return语句,那么此时又会将这里的返回值2传递给test函数,覆盖了原来的返回值1,函数运行到此结束,最终返回值为2;
2.第二种情况,try里面将返回值1传递给test函数,函数未结束,继续执行finally中的语句,x自增1,此时x=2,但是因为此时finally中并没有将自增后的x作为返回值传递给test函数,所以函数test最终的返回值就是try语句中的1,如果你在finally中这样处理:x先自增,然后再return x,那么此时函数test的返回值就会是2。

评分

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

查看全部评分

回复 使用道具 举报
你的finally中的  ++x 虽然执行了,但是你finally中没有return 语句,得到的值没有返回给调用的呀

你在   ++x;后面加一句return x;  就能得到你想要的结果了。

评分

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

查看全部评分

回复 使用道具 举报
有点明白,那就是主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致运行结果是这样,
结合,内存中指向的变化,

我还有一个小问题,!就是int x=1,++x,在内存中是如何变幻的呢!
1是在常量池中,++x在堆内存中!

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 夜空闪亮 于 2013-8-7 22:43 编辑
张玉建 发表于 2013-8-7 12:10
有点明白,那就是主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致 ...

函数的返回值是存放在栈空间中预先分配好的位置,一般就是调用函数的位置,你的第一个测试程序其实函数返回了两次值,先在try语句中返回fun1中的返回值1,但随后执行finally语句块时又将fun2中的返回值2返回了,覆盖了先前返回的1,所以所得的结果返回值是2,输出了2.而测试2中++x由于test方法是静态的,其内部x应该是在程序的静态区中,++x是在静态区中计算的,程序的返回值存储的地方跟++x存储的地方根本不在一个位置,所以x此时算出的结果并不会影响返回值的结果,除非你再将x返回。楼主其实可以在测试2代码中的++x后加上System.out.println(x),就会发现输出的结果就是2,说明x和函数的返回值确实存储不在同一个地方。

评分

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

查看全部评分

回复 使用道具 举报
finally中的  ++x 虽然执行了,但是你finally中没有语句返回。

在   ++x;后面加一句return x;  就可以了。
主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致运行结果是这样,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马