黑马程序员技术交流社区

标题: 关于finally语句块的问题 [打印本页]

作者: 任传敏    时间: 2012-6-23 14:58
标题: 关于finally语句块的问题
对于一个方法中的
try{
return num;
}catch(){
}finally{
int num++
}
据说finally块中的语句一定会被执行,但是如果try块中有return语句,会怎么样呢!?
作者: 马林康    时间: 2012-6-23 15:06
  1. public class Test {
  2.         public static void main(String[] args){
  3.                 System.out.println(method(5));       
  4.         }
  5.         public static int method(int num){
  6.                 try{
  7.                         return num;
  8.                 }finally{
  9.                         System.out.println("fially执行了");
  10.                         num++;
  11.                 }
  12.         }
  13. }
复制代码
结果
fially执行了
5

作者: 马林康    时间: 2012-6-23 15:10
上面那个看不出效果
  1. public class Test {
  2.         public static void main(String[] args){
  3.                 System.out.println(method(5));       
  4.         }
  5.         public static int method(int num){
  6.                 try{
  7.                         return num;
  8.                 }finally{
  9.                         System.out.println("fially执行了"+ ++num);
  10.                 }
  11.         }
  12. }
复制代码
fially执行了 6
作者: 王晓新    时间: 2012-6-23 15:17
try{
return num;
}catch(){
}finally{
int num++
}
finally是一定会执行的,但是如果在try里面加了return,那么得到的值还是num,返回后执行num++,所以最后num的值还是加了1。
作者: 杨康    时间: 2012-6-23 15:30
public static void main(String[] args) {
          System.out.println(new Test().test());
    }

     static int test()
     {
          int x = 1;
          try
          {
              return x;
          }
          finally
          {
              ++x;
          }
     }
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class smallT
{
      public static void main(String args[])
     {
          smallT t = new smallT();
          int b = t.get();
          System.out.println(b);
     }
     public int get()
     {
         try
         {
             return 1 ;
         }
          finally
         {
             return 2 ;
         }
     }
}

返回的结果是2。


我可以通过下面一个例子程序来帮助解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

public class Test {
/**
* @param args add by zxx ,Dec 9, 2008
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Test().test());;
}
int test()
{
try
{
return func1();
}
finally
{
return func2();
}
}
int func1()
{
System.out.println("func1");
return 1;
}
int func2()
{
System.out.println("func2");
return 2;
}
}
-----------执行结果-----------------
func1
func2
2
结论:finally中的代码比return 和break语句后执行

作者: 常佳杰    时间: 2012-6-23 15:45
public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                        System.out.println(method(5));        
                }
                public static int method(int num) throws Exception{
                        try{
                                return num;
                        }catch(Exception e){
                                 throw new Exception("num=null",e);
                        }
                        finally{
                                System.out.println("fially执行了");
                                num++;//
                                //return num;//要是这返回结果就是6.
                                System.out.println(num);//当finally里没有返回,在这输出的是6,在主函数里输出的是5.
                        }
                }
执行结果是:
fially执行了
6
5
楼主要明白:
虽然返回了,但上边的执行顺序是执行完finally再执行主函数里的代码,那个返回值是编译器存储到内存中了不会变。
但当你finally里再有返回的话,它会将前边的覆盖掉。

作者: 游洪波    时间: 2012-6-23 16:01
楼主,finally 块中的语句是一定会执行的,这点是肯定的,下边说说真正实战中finally常常用于关闭资源的工作,比如说在与数据库连接时finally中就会写 connection。close();这样类似的关闭资源的语句。
finally是在return 前执行的,就拿你这个例子来说吧,他在try快中的return num前执行了finally块中的语句吧num的值进行+1运算以后才会返回到try块中执行return num;语句。
作者: 安路凤    时间: 2012-6-23 18:04
try{
return num;
}catch(){
}finally{
int num++
}
当try中出现retun时,finanly当中的语句还是被执行,因为finaly中的语句一定会被执行,但是当try/catch中出现System.exit(0);时,finaly才不会被执行

作者: 任传敏    时间: 2012-6-24 22:55
游洪波 发表于 2012-6-23 16:01
楼主,finally 块中的语句是一定会执行的,这点是肯定的,下边说说真正实战中finally常常用于关闭资源的工 ...

兄弟你的理解有点问题,我刚试了下
public class Test2
{
      public static void main(String args[])
     {
              Test2 t = new Test2();
          int b = t.get(3);
          System.out.println(b);
     }
     public int get(int a)
     {
         try
         {
             return a ;
         }
          finally
         {
                  System.out.println("fially执行了"+ ++a);
         }
     }
}
运行结果是:
fially执行了4
3
如果按你的理解的话应该输出两个4吧
作者: 孙浩迪    时间: 2012-6-24 23:01
public class Test {
        public static void main(String[] args){
                System.out.println(method(5));        
        }
        public static int method(int num){
                try{
                        return num;
                }finally{
                        System.out.println("fially执行了"+ ++num);
                }
        }
}

5
6
除了用到关闭电源,否则不管用到什么finally里的代码都会执行




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