黑马程序员技术交流社区

标题: 对return和finally的疑问? [打印本页]

作者: 严露华    时间: 2013-5-15 17:56
标题: 对return和finally的疑问?
本帖最后由 严露华 于 2013-5-16 22:37 编辑
  1. public class Test{

  2.         public static void main(String[] args) {

  3.                 System.out.println(t());
  4.         }
  5.         public static int  t(){
  6.                 int b =40;
  7.                 try
  8.                 {
  9.                         System.out.println("try语句");
  10.                         return b+=10;
  11.                 }
  12.                 catch(Exception e)
  13.                 {
  14.                         System.out.println("异常处理语句"+e);
  15.                 }
  16.                 finally
  17.                 {
  18.                         System.out.println("finally语句");
  19.                         if(b>45)
  20.                         {
  21.                                 System.out.println("b>45:"+b);
  22.                         }
  23.                         b= 100;
  24.                 }
  25.                 return b;
  26.         }

  27. }
复制代码
打印结果为
try语句
finally语句
b>45:50
50
为什么结果返回的是50而不是100?为什么只返回try语句中的b值却不返回finally语句块中b的值?



作者: 高新星    时间: 2013-5-15 18:16
是先执行的return语句,所以函数先得到返回值,但是还是会执行finally的
  1. public class Test{

  2.     public static void main(String[] args) {

  3.             System.out.println(t());                        //打印t()返回的值50
  4.     }
  5.     public static int  t(){
  6.             int b =40;
  7.             try
  8.             {
  9.                     System.out.println("try语句");
  10.                     return b+=10;                                        //先返回b 的值,再去执行finally ,此时函数的返回值为 50
  11.             }
  12.             catch(Exception e)
  13.             {
  14.                     System.out.println("异常处理语句"+e);
  15.             }
  16.             finally
  17.             {
  18.                     System.out.println("finally语句");
  19.                     if(b>45)
  20.                     {
  21.                             System.out.println("b>45:"+b);
  22.                     }
  23.                     b= 100;
  24.                     System.out.println(b);                        //函数运行后b 的最终值为 100
  25.             }
  26.             return b;                                                                                
  27.     }

  28. }
复制代码
下面这种情况是先执行finally语句后在 return 此时返回的值 为100
  1. public class Test{

  2.     public static void main(String[] args) {

  3.             System.out.println(t());                       
  4.     }
  5.     public static int  t(){
  6.             int b =40;
  7.             try
  8.             {
  9.                     System.out.println("try语句");
  10.                      b+=10;                                
  11.             }
  12.             catch(Exception e)
  13.             {
  14.                     System.out.println("异常处理语句"+e);
  15.             }
  16.             finally
  17.             {
  18.                     b= 100;
  19.                     System.out.println(b);                        //函数运行后b 的最终值为 100
  20.             }
  21.             return b;                                                                                
  22.     }

  23. }
复制代码
运行结果为:
try语句
100
100

作者: 王春晓    时间: 2013-5-15 18:19
这跟try、catch、finally、return的执行顺序有关,在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try中先把要返回的结果存放到一个局部变量中去,执行完finally之后,再从中取出返回结果;因此,即使finally中对变量b进行了改变,但是不会影响返回结果。
作者: xuemeng    时间: 2013-5-15 18:20
public class Demo {
public static void main(String[] args) {
  System.out.println(t());
}
public static int t() {
  // 程序执行步骤
  int b = 40;
  try {
  // 执行1
   System.out.println("try语句");
   // 执行2, 这里特别说明, 这里执行了 b += 10,  b的值是50, 但是没有return
   return b += 10;
  } catch (Exception e) {
   System.out.println("异常处理语句" + e);
  } finally {
   // 执行3
   System.out.println("finally语句");
   // 执行4
   if (b > 45) {
    System.out.println("b>45:" + b);
   }
  // 执行5, 这时候b的值是100, 但是执行这个代码后,程序又返回去了, 返回 执行2处 执行return
   // 而这里的b是50, 所以最后返回的是50, 而不是100

   b = 100;
  }
  return b;
}
}

如果你想要100, 代码可以做一下修改:
下面的代码, 返回的就是100
public class Demo {
public static void main(String[] args) {
  System.out.println(t());
}
public static int t() {
  int b = 40;
  try {
   System.out.println("try语句");
   return b += 10;
  } catch (Exception e) {
   System.out.println("异常处理语句" + e);
  } finally {
   System.out.println("finally语句");
   if (b > 45) {
    System.out.println("b>45:" + b);
   }
   return b = 100;
  }
}
}






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