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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 简★零度 中级黑马   /  2013-11-14 22:45  /  1454 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int num = getNumber();
  System.out.println(num);
}

private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a  } finally {
   a = 40;
  return a;   }
}
}
运行结果是40;
int num = getNumber();
  System.out.println(num);
}
private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a         
      } finally {
   a = 40;
  }
return a;
}
}
运行结果是30.





为什么?不是道return就结束程序吗?

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
To + 1 + 2 很给力!

查看全部评分

6 个回复

倒序浏览
int num = getNumber();
  System.out.println(num);
}

private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a   //此处有return,本应该返回a并跳出方法了,但还有finally;
}   
   finally {
   a = 40;      //所以先执行finally,然后再执行catch中的return 返回a为30;
  return a;   } //但是finally中有return,所以就执行finally中的return
                  返回值为40, 不执行catch中的return了。
}
}
所以运行结果是40;


int num = getNumber();
  System.out.println(num);
}
private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a    //然后此处有return,本应该返回a并跳出方法了,但还有finally      
}
finally {      //所以先执行finally,然后再执行catch中的return 返回a为30;
   a = 40;
  }
  return a;    //此处的returned将不会执行,除非前边没有return语句
                (比如将catch中的return语句去掉),那么他才会执行并返回40。
}
}
所以运行结果是30.

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
int num = getNumber();
  System.out.println(num);
}

private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a  } finally {
   a = 40;
  return a;   }
}
}
运行结果是40;//因为finally的代码是必须执行的,如果虚拟机没有停止的话,所以a=40
int num = getNumber();
  System.out.println(num);
}
private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a         
      } finally {
   a = 40;
  }
return a;
}
}
运行结果是30.//因为在获取异常那里已经返回了值,此执行的finally,没有return,所以不变。

评分

参与人数 1黑马币 +15 收起 理由
狼王 + 15

查看全部评分

回复 使用道具 举报
对于return语句与finally的区别需要细讲,运行的先后顺序是先执行finally中的内容,在进行return。对于你的第一段代码中,由于在fianlly中已经有了return语句,所以此时a=40已经直接返回了,程序结束了。而对于第二段代码中执行的顺序是try-》ccatch-》finally,由于在catch中a=30已经return了,此时程序就已经结束了,由于finally中没有return,a的值不会变化

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 rebirth 于 2013-11-15 10:15 编辑

去翻翻java核心技术或者java编程思想关于try catch finally的说明,finally中的内容一定要执行。当catch里有return时也要执行,如果finally也有return就覆盖之前的return,若没有则在执行完finally之后立刻执行catch的return。另外建议一定要看java编程思想,没看过一遍极端的讲都不算入门
回复 使用道具 举报
finally是必执行程序,不受到return的限制,这是一种异常的处理机制,会用就行,不用追究,你可以在第二个程序里面把finally里加一句System.out.println(a);你看看输出,这条语句肯定能执行,并且是40.
回复 使用道具 举报
int num = getNumber();
  System.out.println(num);
}

private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a  } finally {
   a = 40;
  return a;   }
}
}
运行结果是40;
tyr中异常被catch捕获,并处理,此时已经返回a=30,程序本应该结束,但是有finally时必须执行finally,而且finally里有return,因此a=40并返回此值,覆盖了a=30.结果a=40.
int num = getNumber();
  System.out.println(num);
}
private static int getNumber() {
  int a = 10;
  try {
   a = 20;
   System.out.println(a / 0);
  } catch (ArithmeticException e) {
   a = 30;
   return a         
      } finally {
   a = 40;
  }
return a;
}
}
运行结果是30.
同上,catch返回a=30,必须执行finally,此时a=40,但是没有return,a=40并没有返回给调用者,因此结果为30.
   两者的区别在于,finally改变了a的值,但是一个里边返回了改变后的值,一个里边没有返回改编后的值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马