黑马程序员技术交流社区

标题: 关于返回值的问题 [打印本页]

作者: fiend    时间: 2012-7-28 09:51
标题: 关于返回值的问题
public class Test {
      public static void main(String[] args) {
               // 为什么这里是输出:0
               System.out.println("testTry():" + testTry());
     }

      public static int testTry() {
          int i = 0;
          try {
                 return i;
          } catch (Exception e) {
                e.printStackTrace();
         } finally {
               ++i;
         }
         return 0;
      }
}
我用调式跟踪了一下:

执行下一步:
此时 i  的值为0,从代码上在的视图窗口中可以看到value 为 0
继续执行:
这时由于第34行还没得到执行,所以 i 的值依然为0
继续执行:
我们可以看到,执行又返回到try块的return语句那里了,这时 i  的值为 1
根据常识我们应该都会认为这里会将1给返回的。
继续执行:
此时又返回到输出语句处。
继续执行:
结果却输出的是0!!!!!谁能告诉我这是为什么?眼见不为实?我可是亲自跟踪调试看到值为1的啊啊啊啊啊求解。。。。


作者: 陈汉维    时间: 2012-7-28 09:58
public class Test {
      public static void main(String[] args) {
               // 为什么这里是输出:0
               System.out.println("testTry():" + testTry());
     }

      public static int testTry() {
          int i = 0;
          try {
                 return i;//执行到这里,i的值是0,程序结束,testTry()返回的值就是0,但是finally也要执行
          } catch (Exception e) {
                e.printStackTrace();
         } finally {
               ++i;//因为是先自增再赋值,所以这就是说你的为什么看到i的值变成1
         }
         return 0;
      }
}


作者: 李菁    时间: 2012-7-28 10:00
return结束方法,当到try时,就已经return i,你已经赋值i=0,
因为try里return结束了方法,所以finally没有走,因此输出为0
作者: 田建    时间: 2012-7-28 10:01
本帖最后由 田建 于 2012-7-28 10:07 编辑

应该是直接return的结果!

作者: 吴小东    时间: 2012-7-28 10:03
楼主如果看过论坛里面其他关于try catch finally 的 帖子就不会问这个问题了
  1. public static int tryCatch()
  2.         {
  3.                 int x = 0;
  4.                 try
  5.                 {
  6.                         return x;
  7.                         /*
  8.                         首先程序执行到这一步的时候,已经确定了返回值为 0
  9.                         以为后面还要执行finally 所以这里的返回值先保存起来
  10.                         */
  11.                 }
  12.                 catch (Exception ex)
  13.                 {
  14.                 }finally
  15.                 {
  16.                         ++i;
  17.                         //当执行到++i的时候 i的值变成1,但是也只局限于对i的值的改变,并没有改变到程序的返回值
  18.                         return i;
  19.                         //如果这里再加上一个return语句的话,那么返回值就会变为 1
  20.                 }
  21.                 return 0;
  22.         }
复制代码

作者: 乐峰    时间: 2012-7-28 10:12
public class Test {
      public static void main(String[] args) {
               // 为什么这里是输出:0
               System.out.println("testTry():" + testTry());
     }

      public static int testTry() {
          int i = 0;
          try {
                 return i;//因为该程序并没有发生异常,所以走try块里面的语句,执行return i,此时i等于0返给主函数的输出语句,之后再走finally,自增i,i变成1,所以语句输出是0.如果发生异常,会先走try或者catch块中return之前的语句,在执行finally中的语句,最后再走try或者catch中的return语句退出,此时返回主函数的输出值会是1.
          } catch (Exception e) {
                e.printStackTrace();
         } finally {
               ++i;
         }
         return 0;
      }
}





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