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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-22 23:32  /  4300 人查看  /  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 个回复

倒序浏览
finally 代码块里的内容是在最后程序执行前执行的。一般和 try catch 一起用,无论是否出现异常都要执行,来做资源清理工作。
  1. public class T {
  2. public static void main(String[] args) {
  3.          new T().dis();
  4. }

  5. int dis(){
  6.          System.out.println("hello");
  7.          try{
  8.                  return dd();
  9.          }finally{
  10.                  System.out.println("nihao ");
  11.                  return 1;
  12.          }
  13. }

  14. int dd(){
  15.          System.out.println("ni lai le ");
  16.          return 3;
  17. }
  18. }


  19. 结果:hello
  20. ni lai le
  21. nihao
复制代码
可以看出finally 内的代码是在 try中return执行过程中,但还没执行完时执行的……
回复 使用道具 举报
finally的作用一般是用来释放资源的,比如数据库连接完成后,一般都要关闭数据库连接。这个关闭数据库资源的代码就放在finally代码块中。
finally中的代码是肯定要执行的,你这个代码的执行过程就是先给返回一个1给b,然后执行finally中的代码,将1替换成2。所以最后打印的就是2.
回复 使用道具 举报
finally 一般作用是关闭资源用的, 比如关闭流之类的。 无论代码是怎么样的,最后都必须执行finally{}     代码里面的东西的。
回复 使用道具 举报
薄炳鑫 发表于 2012-6-22 23:47
finally的作用一般是用来释放资源的,比如数据库连接完成后,一般都要关闭数据库连接。这个关闭数据库资源的 ...

刚刚写了几个输出打印,大概了解了,只是没接触过 finally ... 不知道是啥玩意
回复 使用道具 举报
薄炳鑫 发表于 2012-6-22 23:47
finally的作用一般是用来释放资源的,比如数据库连接完成后,一般都要关闭数据库连接。这个关闭数据库资源的 ...

不对吧,程序不可能把1给b后 再跳回来执行finally吧?执行过return就从方法里跳出了啊……应该是再执行return 1 过程中 执行finally里的代码,跳出该方法……
回复 使用道具 举报
你这是一个try{}finally{}语句,finally语句里语句必须执行。
在你这个程序中先t.get()调用get()方法,程序按顺序执行,先执行try语句,执行后再执行finally语句,有用你定义的是int b为栈内存,就return 2.所以b=2.
回复 使用道具 举报
孙峰 黑马帝 2012-6-22 23:55:20
8#
        finally 代码块中的代码在一般情况下是一定会执行的。   这里主要是对一些系统资源占用的终止。 因为该代码块和try 一起使用时,如果发生异常,则部分系统资源的占用就无法释放, 此时 就是finally 代码块发挥作用的时候了。      当然也不是肯定都会执行,比如 此前有语句:System.exit(0);  系统退出语句,JVW结束,也就执行不到了。
回复 使用道具 举报
丁二跃 发表于 2012-6-22 23:52
不对吧,程序不可能把1给b后 再跳回来执行finally吧?执行过return就从方法里跳出了啊……应该是再执行re ...

也就是返回值的时候 只返回了 2 ? 那个 try中的 1 没有返回给b ?

我开始也是以为是 返回了 1 之后 再返回 2 替换了值
回复 使用道具 举报
丁二跃 发表于 2012-6-22 23:52
不对吧,程序不可能把1给b后 再跳回来执行finally吧?执行过return就从方法里跳出了啊……应该是再执行re ...

我觉得他最后肯定要执行那个finally中的那个return 2;的代码,所以应该就是把2 付给b了。
回复 使用道具 举报
finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。
回复 使用道具 举报
余银桂 发表于 2012-6-22 23:56
也就是返回值的时候 只返回了 2 ? 那个 try中的 1 没有返回给b ?

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

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

一个方法怎么会在一次调用中返回两个值呢?!
回复 使用道具 举报
孙峰 发表于 2012-6-22 23:55
finally 代码块中的代码在一般情况下是一定会执行的。   这里主要是对一些系统资源占用的终止。 因 ...

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

那是肯定的,只不过 那个一 应该没有被返回……一次调用哪能返回两个值呢
回复 使用道具 举报
余银桂 发表于 2012-6-23 00:00
那 try 中的  return 1 有没有执行?

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

评分

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

查看全部评分

回复 使用道具 举报
丁二跃 发表于 2012-6-23 00:06
执行了,没执行完   把1 换成个方法,在方法里加上打印语句  象我 上面的代码  就可以看出来了 ...

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

return 1 也执行了, 执行之后又执行finally ,又返回了2,重新赋值了,  你可以看下老毕的 第10 天视频第一个,在6‘20”的位置
回复 使用道具 举报
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 11:23
public class  Test5

{

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

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

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

不能说明问题啊

还是认为一个方法在一次调用中 不可能返回2 个值
回复 使用道具 举报
丁二跃 发表于 2012-6-23 11:36
黄老大 这个也不能说明 返回 1 然后2 又覆盖了啊

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

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