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

© 余银桂 中级黑马   /  2012-6-22 23:32  /  4942 人查看  /  29 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-22 23:53 编辑
  1. public class  Test6

  2. {

  3.       public static void  main(String args[])

  4.       {

  5.             Test6 t  = new  Test6();

  6.             int  b  =  t.get();

  7.             System.out.println(b);

  8.       }

  9.       

  10.       public int  get()

  11.       {

  12.             try

  13.             {

  14.                   return 1 ;

  15.             }

  16.             finally

  17.             {

  18.                   return 2 ;

  19.             }

  20.       }

  21. }
复制代码
运行结果返回是 2   
我想知道 程序的执行过程,为什么会返回 2
finally 的主要作用又是什么?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 我只能说,老毕听到你说没听过finally的时.

查看全部评分

29 个回复

正序浏览
有些异常如果不处理,也就不会继续下去了。即程序从catch里改变控制流,不会执行后面的语句。加了finally,可以保证即使因为异常,后面的代码不会被执行,但是finally里面的语句还是会执行,这样可以释放一些申请的资源~或者做一些其他工具,比如作profiling统计等。所以在try{}中的finally是一定会执行的。为了程序的健壮性,不能在用户使用的时候在一些突发小异常的照成程序直接终止。

回复 使用道具 举报
孙峰 黑马帝 2012-6-23 18:42:04
29#
黄奕豪 发表于 2012-6-23 11:57
哥,我错了!!可是你看看,哪个是重点啊?
finally 代码块中的代码在一般情况下是一定会执行的。   这里 ...

:kiss:{:3_51:}
回复 使用道具 举报
  public int[]  get()

      {
             //原值4和5,打印的是1和2,说明这两个代码都执行了,你的那个输出2是被覆盖的!
            int[] arr = {4,5};
            try

            {
                    arr[0]=1;
                  return arr ;

            }

            finally

            {
                      arr[1]=2;
                  return arr ;

            }

      }
我想给你说下 ,你可以把try中的 return 去掉试试,结果还是会一样的  应为finally里边的代码只会在return前执行,所以说你try中的return arr;形同虚设

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
嘿嘿,我在做笔试题的时候有一个这样的问题:try{}catch{}中的finally{}中的代码会不会被执行,如果会是在return前还是return 后
答案是  会被执行,return前执行,那么这样的话你是不是会明白一点呢?
public int  get()



      {



            try



            {



                  return 1 ;



            }



            finally



            {



                  return 2 ;



            }



      }
你这个方法在执行的时候首先执行到try里边的时候执行到在执行到return语句的时候他会提前执行 finally中的语句 刚好你里边写了一个return 2; return的意思是跳出这个方法 所以你收到的返回值是2;也就是说你try中的return 根本没有被执行,你如果改成
        try{
                        return 1;       
                }finally{
                        System.out.println("finally");
                }
你试试,他会先输出finally然后给你返回一个1,我改完以后跟你的区别就在于,你在finally中直接使用return退出了方法而我没有 所以我try中的return 1还是会被执行的。
回复 使用道具 举报
孙峰 黑马帝 2012-6-23 13:58:34
26#
黄奕豪 发表于 2012-6-23 11:57
哥,我错了!!可是你看看,哪个是重点啊?
finally 代码块中的代码在一般情况下是一定会执行的。   这里 ...

那哥们不是问finally的主要作用了嘛
回复 使用道具 举报
return 1 应该没有执行  执行了就是返回值了结束了 应该是直接跳接到finally执行其中语句。 直接赋予get()方法return2

finally方法毕老师的视频里有讲噢~  finally 利用它一定会执行到它代码块的特点,在try catch中有异常时用finally对停止系统资源占用。不然有异常了部分系统资源会被占有,卡在那里。
回复 使用道具 举报
孙峰 发表于 2012-6-23 11:54
斑竹不给分 抗议 抗议

哥,我错了!!可是你看看,哪个是重点啊?
finally 代码块中的代码在一般情况下是一定会执行的。   这里主要是对一些系统资源占用的终止。 因为该代码块和try 一起使用时,如果发生异常,则部分系统资源的占用就无法释放, 此时 就是finally 代码块发挥作用的时候了。      当然也不是肯定都会执行,比如 此前有语句:System.exit(0);  系统退出语句,JVW结束,也就执行不到了。
回复 使用道具 举报
只能return返回一次,应为执行return 时,函数就结束了。try中的return没有返回结果,finally中的才返回结果
回复 使用道具 举报
孙峰 黑马帝 2012-6-23 11:54:21
22#
黄奕豪 发表于 2012-6-23 11:23
public class  Test5

{

斑竹不给分 抗议 抗议:@
回复 使用道具 举报
丁二跃 发表于 2012-6-23 11:36
黄老大 这个也不能说明 返回 1 然后2 又覆盖了啊

执行完 arr[0]=1 后数组变成 {1,5}

昨晚翻阅了一下,看到有一个地方是这么讲解的。

try 中的return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
回复 使用道具 举报
丁二跃 发表于 2012-6-23 11:36
黄老大 这个也不能说明 返回 1 然后2 又覆盖了啊

执行完 arr[0]=1 后数组变成 {1,5}

怎么说呢?return语句后面一般都不会执行的,但是这是个特殊情况,只能说实际开发中一般不会出现这种情况,想了一下,你可以把他理解为开始打算返回了1,后面一看还有finally语句,这个finally是老大,肯定得看看他有什么指示,是吧?结果他说返回2,不要1了。所以就把方法体里面打算返回的1给覆盖了!函数不会有两个返回值,1是在get()函数里面被覆盖的!这个并不违背它。因为执行finally的时候这个函数还没有结束,而返回值是要在函数结束后才返回的!
回复 使用道具 举报
黄奕豪 发表于 2012-6-23 11:23
public class  Test5

{

黄老大 这个也不能说明 返回 1 然后2 又覆盖了啊

执行完 arr[0]=1 后数组变成 {1,5}

在执行 finally 中代码 返回 {1,2}

不能说明问题啊

还是认为一个方法在一次调用中 不可能返回2 个值
回复 使用道具 举报
public class  Test5

{

      public static void  main(String args[])

      {

            Test5 t  = new  Test5();

            int[]  b  =  t.get();
            for(int i : b)
            {
                    System.out.println(i);
            }

      }

      

      public int[]  get()

      {
             //原值4和5,打印的是1和2,说明这两个代码都执行了,你的那个输出2是被覆盖的!
            int[] arr = {4,5};
            try

            {
                    arr[0]=1;
                  return arr ;

            }

            finally

            {
                      arr[1]=2;
                  return arr ;

            }

      }

}
回复 使用道具 举报
孙峰 黑马帝 2012-6-23 00:33:44
17#
余银桂 发表于 2012-6-23 00:00
那 try 中的  return 1 有没有执行?

return 1 也执行了, 执行之后又执行finally ,又返回了2,重新赋值了,  你可以看下老毕的 第10 天视频第一个,在6‘20”的位置
回复 使用道具 举报
丁二跃 发表于 2012-6-23 00:06
执行了,没执行完   把1 换成个方法,在方法里加上打印语句  象我 上面的代码  就可以看出来了 ...

先谢谢你了,我再研究研究一下,有点混乱了
回复 使用道具 举报
余银桂 发表于 2012-6-23 00:00
那 try 中的  return 1 有没有执行?

执行了,没执行完   把1 换成个方法,在方法里加上打印语句  象我 上面的代码  就可以看出来了

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
薄炳鑫 发表于 2012-6-22 23:58
我觉得他最后肯定要执行那个finally中的那个return 2;的代码,所以应该就是把2 付给b了。 ...

那是肯定的,只不过 那个一 应该没有被返回……一次调用哪能返回两个值呢
回复 使用道具 举报
孙峰 发表于 2012-6-22 23:55
finally 代码块中的代码在一般情况下是一定会执行的。   这里主要是对一些系统资源占用的终止。 因 ...

那 try 中的  return 1 有没有执行?
回复 使用道具 举报
余银桂 发表于 2012-6-22 23:56
也就是返回值的时候 只返回了 2 ? 那个 try中的 1 没有返回给b ?

我开始也是以为是 返回了 1 之后 再 ...

你看我 上面那个程序,很明显在 try中的 return 过程中调用了fianlly,既然调用了finally,那其里面的return 执行后不是要跳出这个方法了吗?^^^那么try 中return的 执行就没有进行到底,也就没返回

一个方法怎么会在一次调用中返回两个值呢?!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马