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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hanrongle 中级黑马   /  2013-7-13 08:33  /  1879 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-14 18:17 编辑

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

查看全部评分

12 个回复

倒序浏览
因为你在try块中有return语句   程序执行到该语句时就直接将1返回了, 下面的语句不再执行
  1. try{
  2.        ret+=1;
  3.        return ret;//return将1返回,并跳出f()方法,finally内的语句不再执行
  4.    }
复制代码
回复 使用道具 举报
因为你在try块中有return语句   程序执行到该语句时就直接将1返回了, 下面的语句不再执行
  1. try{
  2.        ret+=1;
  3.        return ret;//return将1返回,并跳出f()方法,finally内的语句不再执行
  4.    }
复制代码
回复 使用道具 举报
mk7 发表于 2013-7-13 08:53
因为你在try块中有return语句   程序执行到该语句时就直接将1返回了, 下面的语句不再执行 ...

不是说有finally,都会被执行吗?
回复 使用道具 举报
真不好意思  给你说错了  原因是你的return语句放在finally块外面了 放在finally里面就返回101了
回复 使用道具 举报
本帖最后由 一木榜公 于 2013-7-13 09:18 编辑

  1. <P>try{
  2.        ret+=1;
  3.        return ret;                        //   这时  return语句下面的语句执行不到,  给函数返回1
  4.    }</P>
  5. <P>catch(Exception e)                  //try语句如果没有抛出异常,catch块不执行,</P>
  6. <P>{
  7.        ret+=10;
  8. }</P>
  9. <P>finally                                      //finally肯定执行,这是规定,这时ret内存中的值是 101   ,但是没返回给函数</P>
  10. <P>{
  11.       ret+=100;
  12. }</P>
  13. <P> </P>
  14. <P>return ret;               //这句是执行不到的,因为前面有return语句,return语句下面的语句肯定执行不到</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
楼主可以试试,如果在final块中末尾加一句打印语句把 ret  打印一下的话  他的值是101, 但返回的值却是1,  这说明 f() 方法是先在 try块中先把1给返回去了,然后再执行的final块的。
回复 使用道具 举报
finally里面是不能对返回值进行修改的,所以你返回的是1,而不是101,finally是先于try代码块里面的return语句执行的,所以
  1. int f(){
  2.        int ret=0;
  3.        try{
  4.        ret+=1;
  5.        return ret;
  6.    }catch(Exception e){
  7.        ret+=10;
  8.    }finally{
  9.       ret+=100;//这个是先于return语句执行,就是执行完finally里面的语句后,才会执行return语句,但是finally是不能对返回值进行修改的,所以你返回的是1而不是101
  10.    }
  11.       return ret;//这里是执行不到的,try代码块里面的return返回后这里就执行不了了
  12. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
执行完return语句就结束了
回复 使用道具 举报
朋友,如果程序中有finally,那么必须是先执行完finally里面的内容然后再去执行return的,但是,有一点,finally中修改了值,但是,return已经把返回值放在了池中,就像是发射器上,所以,虽然执行了finally但是依旧不会返回修改后的那个值。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
其实这里面有两点你留心就可以了~第一是finally是无法改变返回值的!其二是看return在什么地方!!根据你的代码,try中有return,也就是已经有返回值了,返回的当然是1.而根据我和你说的第一点~finall是无法改变返回值的,所以不可能输出101!!希望对你有帮助
回复 使用道具 举报
public class demo2 {
        public static void main(String[] args) {
                System.out.println(f());
        }

        static int f(){
              int ret=0;
              try{
              ret+=1;
              System.out.println(ret);
              return ret;
          }catch(Exception e){
              ret+=10;
          }finally{
             ret+=100;
             System.out.println(ret);
             return ret;
          }
            // return ret;
        }
这样写会返回101

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

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