黑马程序员技术交流社区
标题:
函数里面有2个return,为什么只打印了一个值?
[打印本页]
作者:
、海
时间:
2014-6-8 09:45
标题:
函数里面有2个return,为什么只打印了一个值?
public class Test3 {
public static void main(String[] args) {
System.out.println(Return());
}
public static int Return(){
int a = 1;
int b =a+1;
try {
return a;//第一个返回值a
} finally {
return b;//第二个返回值b
}
}
}
结果为2
作者:
阿苏勒
时间:
2014-6-8 09:55
本帖最后由 阿苏勒 于 2014-6-8 09:57 编辑
在执行try或catch代码块的return语句时,如果finally里面有return语句,会先执行finally代码块。
finally代码块的return语句会覆盖掉try或catch代码块的return语句。
说明代码
public class FinallyReturn {
public int methodA(int money)throws SpecialException{
if(--money<=0) throw new SpecialException("Out of money");
return money;
}
public int methodB(int money){
try{
return methodA(money); //可能抛出异常
}catch(SpecialException e){
return -100;
}finally{
return 100; //会覆盖try和catch代码块的return语句
}
}
public static void main(String args[]){
FinallyReturn s=new FinallyReturn ();
System.out.println(s.methodB(1)); //打印100
System.out.println(s.methodB(2)); //打印100
}
}
复制代码
作者:
艮昕辶
时间:
2014-6-8 10:07
return 等同于函数结束
程序会直接跳转到下一个语句
public class Test3 {
public static void main(String[] args) {
System.out.println(Return());
System.out.println("程序已经return会直接跳转到这里不会执行Return()中的finally语句");
}
public static int Return(){
int a = 1;
int b =a+1;
try {
return a;//第一个返回值a
} finally {
return b;//第二个返回值b
}
}
}
复制代码
作者:
江祖贇
时间:
2014-6-8 10:49
finally中的代码需要先执行 而 return 等同于函数结束 所以 try中的语句 不被执行
作者:
sun_jun
时间:
2014-6-8 12:08
当try和finally代码块中都有return语句时,先执行try中的非return语句,执行到return语句时,直接跳过try中的return语句,执行finally中的语句。
作者:
sun_jun
时间:
2014-6-8 12:16
再补充下!return语句执行完,该方法执行结束,但是finally代码块石必须执行的。故,在该方法执行结束前,即执行return语句前必须先执行finally代码块。不过由于finally代码块中也有return语句,也就是说fianlly中return语句先执行,执行后该方法结束,就不会再去执行try代码块中的return语句啦!希望
作者:
123_yaya
时间:
2014-6-8 12:48
看答案来了,学习了。
作者:
18353666072
时间:
2014-6-8 13:02
边逛论坛,;P边学习了.......
作者:
倪大大
时间:
2014-6-8 13:33
一个函数只能return一次 函数就结束了
finally 中的语句优先所有语句 所以他先执行return语句, try中得return语句就没机会执行,也可以说被隐藏了
作者:
wangkerui
时间:
2014-6-8 13:50
同问啊,我也蒙了!
作者:
sam9204
时间:
2014-6-8 14:41
return代表函数结束,但finally语句块必须要执行,所以遇到try语句块的return,程序会自动选择先去执行finally语句块,如果finally语句块有return语句则不会再执行try语句块的return
作者:
xp8812
时间:
2014-6-8 15:28
你的代码碰到第一个return的时候,就已经返回了,finally是在函数没有return的情况下才会必执行
作者:
、海
时间:
2014-6-8 17:39
阿苏勒 发表于 2014-6-8 09:55
在执行try或catch代码块的return语句时,如果finally里面有return语句,会先执行finally代码块。
finally代 ...
public class Test3 {
public static void main(String[] args) {
System.out.println(Return());
}
public static int Return(){
int a = 1;
int b=a+1;
try {
System.out.println("11");
return a;
} finally {
return b;
}
}
}
复制代码
打印结果
11
2
说明有执行try里面的啊!
作者:
、海
时间:
2014-6-8 17:47
public class Test3 {
public static void main(String[] args) {
System.out.println(Return());
}
public static int Return(){
int a = 1;
int b=a+1;
try {
System.out.println("执行try");
return a;
} finally {
System.out.println("执行finally");
}
}
}
复制代码
打印结果
执行try
执行finally
1
作者:
、海
时间:
2014-6-8 17:52
通过以上可以看出;读到return a语句时就跳出try执行finally,然后再执行try中return a,如果finally中有return b,则return b执行并结束。 在这里我就有另一个疑问,一个函数执行是否只能返回一个值呢?
作者:
丁绍然
时间:
2014-6-8 17:57
我觉得这是个语句执行优先级的问题
在这个函数里你要看先执行哪个,执行到try里面的return的时候jvm会判断是否有finally语句,如果有就先执行finally里面的语句,执行到finally里的return就直接返回值。完事了
作者:
小周务商
时间:
2014-6-8 18:11
都被人家回答完了。。。。
作者:
Hi天天向上
时间:
2014-6-8 18:22
学习了
作者:
Dr_manhattan
时间:
2014-6-8 21:10
一个方法中,不管是什么代码块只要执行到了return语句方法就结束,所以不会执行另外那个语句了
作者:
2528870651
时间:
2014-6-8 22:00
其实是这样的,程序的流程是先执行try
然后,执行finally。因为try里面由return语句,所以会返回一个值,
但是,
注意:这个返回值并不是马上就返回的,而是会暂时存放在内存中的某个地方(到底哪里我也不记得了)
然后,就会去执行finally里面的代码。
因为,这时finally里面也有一个return语句,所以它也要返回一个值,这时,finally里面的return的值就会
把前面的return 的值覆盖。
所以,最后返回的是finally里面的return的值,而不是try里面的return的值。
作者:
java木
时间:
2014-6-8 22:46
return 语句是一个函数的结束不假,但如果函数有finally语句块,那该方法就算执行到它也不会立即结束,会继续执行finally语句块的内容。finally也有return语句很显然,它覆盖了try语句里的retrun。
作者:
依然阿邦
时间:
2014-6-8 23:25
还没看到这:L
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2