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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fiend 中级黑马   /  2012-7-28 09:51  /  2052 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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的啊啊啊啊啊求解。。。。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
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;
      }
}

回复 使用道具 举报
return结束方法,当到try时,就已经return i,你已经赋值i=0,
因为try里return结束了方法,所以finally没有走,因此输出为0
回复 使用道具 举报
本帖最后由 田建 于 2012-7-28 10:07 编辑

应该是直接return的结果!
回复 使用道具 举报
楼主如果看过论坛里面其他关于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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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;
      }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马