黑马程序员技术交流社区

标题: 关于return和异常的 [打印本页]

作者: 简★零度    时间: 2013-11-14 22:45
标题: 关于return和异常的
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就结束程序吗?

作者: 迪兰奇迹    时间: 2013-11-14 23:44
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.


作者: 杨增坤    时间: 2013-11-14 23:52
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,所以不变。


作者: 星星Fighting    时间: 2013-11-15 00:10
对于return语句与finally的区别需要细讲,运行的先后顺序是先执行finally中的内容,在进行return。对于你的第一段代码中,由于在fianlly中已经有了return语句,所以此时a=40已经直接返回了,程序结束了。而对于第二段代码中执行的顺序是try-》ccatch-》finally,由于在catch中a=30已经return了,此时程序就已经结束了,由于finally中没有return,a的值不会变化
作者: rebirth    时间: 2013-11-15 10:14
本帖最后由 rebirth 于 2013-11-15 10:15 编辑

去翻翻java核心技术或者java编程思想关于try catch finally的说明,finally中的内容一定要执行。当catch里有return时也要执行,如果finally也有return就覆盖之前的return,若没有则在执行完finally之后立刻执行catch的return。另外建议一定要看java编程思想,没看过一遍极端的讲都不算入门
作者: 轩辕迪卡    时间: 2013-11-15 10:31
finally是必执行程序,不受到return的限制,这是一种异常的处理机制,会用就行,不用追究,你可以在第二个程序里面把finally里加一句System.out.println(a);你看看输出,这条语句肯定能执行,并且是40.
作者: 天ya~_琼楼    时间: 2013-11-15 11:47
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的值,但是一个里边返回了改变后的值,一个里边没有返回改编后的值。




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