黑马程序员技术交流社区
标题:
关于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