黑马程序员技术交流社区

标题: 异常处理块 [打印本页]

作者: kimi    时间: 2013-6-10 11:47
标题: 异常处理块
本帖最后由 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么
作者: x.love    时间: 2013-6-10 12:07
本帖最后由 x.love 于 2013-6-10 12:09 编辑

因为finally语句块中对ret变量值的修改仅仅在finally语句块中有效,但是返回结果就无效了。这是基础测试中的一道题呀
作者: 不破大地    时间: 2013-6-10 14:10
哈哈,你怎么算的是101呢,return语句因为要进栈,然后出栈,所以return在finally执行后在执行。。。
作者: shang1jk    时间: 2013-6-10 14:21
大概是return ret;语句之后这个返回值1就已经在一个内存空间存着了,等待返回但是还没有返回, 知道finally语句运行完了再返回。
而最后那个return ret;不会被执行。
作者: Renica    时间: 2013-6-10 14:25
因为没有异常发生,所以后面的就不执行了,直接在第一个return就返回了。
作者: 孔雀东南飞    时间: 2013-6-10 14:58
本帖最后由 孔雀东南飞 于 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>}


复制代码
楼主可明白了。。?
作者: x.love    时间: 2013-6-10 15:41
x.love 发表于 2013-6-10 12:07
因为finally语句块中对ret变量值的修改仅仅在finally语句块中有效,但是返回结果就无效了。这是基础测试中 ...

因为finally中的ret是系统重新定义的一个引用变量,指向了try中的ret。无论finally中的ret怎么改变,都不影响try中的值。
作者: pys200603027    时间: 2013-6-10 21:47
虽然说finally中的语句块是必须运行的,但是在try块里return的话,即使finally中ret+=100;但是并不能改变掉try块中的return ret;代码最后的return ret,只有在try块出现了异常,才会跳到该处运行。
作者: 孔雀东南飞    时间: 2013-6-10 23:37
先执行第一个return
在执行finally
第二个return不执行




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