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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kimi 中级黑马   /  2013-6-10 11:47  /  2010 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kimi 于 2013-6-10 15:45 编辑

int f(){
      int ret=0;
      try{
      ret+=1;
      return ret;
  }catch(Exception e){
      ret+=10;
  }finally{
     ret+=100;
  }
     return ret;
}

ret为什么返回的是1  不是应该是101么

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
本帖最后由 x.love 于 2013-6-10 12:09 编辑

因为finally语句块中对ret变量值的修改仅仅在finally语句块中有效,但是返回结果就无效了。这是基础测试中的一道题呀

点评

弄否解释下,为什么, ret是个方法内公共变量啊,为什么说finally块中改变了 ret值 到返回时就无效了?  发表于 2013-6-10 15:09

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哈哈,你怎么算的是101呢,return语句因为要进栈,然后出栈,所以return在finally执行后在执行。。。
回复 使用道具 举报
大概是return ret;语句之后这个返回值1就已经在一个内存空间存着了,等待返回但是还没有返回, 知道finally语句运行完了再返回。
而最后那个return ret;不会被执行。

点评

貌似这样能说的同, 有木有权威点的参考  发表于 2013-6-10 15:11

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为没有异常发生,所以后面的就不执行了,直接在第一个return就返回了。
回复 使用道具 举报
本帖最后由 孔雀东南飞 于 2013-6-10 15:00 编辑
  1. int f(){
  2.       int ret=0;
  3.       try{
  4.       ret+=1;
  5. <FONT color=red>      return ret;//此时已经返回ret    值为1,后面必须执行finally,但是最后的return  不执行了。因此返回了1但是ret'值最后为101,只不过没有返回
  6. </FONT>  }catch(Exception e){
  7.       ret+=10;
  8.   }finally{
  9.      ret+=100<FONT color=red>;//此句执行   ret=101    但不打印</FONT>
  10.   }
  11. <FONT color=red>     return ret;//此句执行不到
  12. </FONT>}


复制代码
楼主可明白了。。?

点评

现在问题是 先执行的return 还是先执行的finally块  发表于 2013-6-10 15:12

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
x.love 中级黑马 2013-6-10 15:41:10
7#
x.love 发表于 2013-6-10 12:07
因为finally语句块中对ret变量值的修改仅仅在finally语句块中有效,但是返回结果就无效了。这是基础测试中 ...

因为finally中的ret是系统重新定义的一个引用变量,指向了try中的ret。无论finally中的ret怎么改变,都不影响try中的值。
回复 使用道具 举报
虽然说finally中的语句块是必须运行的,但是在try块里return的话,即使finally中ret+=100;但是并不能改变掉try块中的return ret;代码最后的return ret,只有在try块出现了异常,才会跳到该处运行。
回复 使用道具 举报
先执行第一个return
在执行finally
第二个return不执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马