在Java中,
1、如果try语句中有return,那么finally语句(没有return)是否执行? 执行。
2、如果try语句,finally语句块中都有return,怎样执行?
从try->catch->finally依次执行(如果异常执行catch),并返回最后一次return的结果。
3、如果try语句中有return而finally语句中没有,finally中代码是否会影响try中return返回值的结果? 不会
情况一:
public class Function {
public static void main(String[] args) {
Function fun = new Function();
System.out.println(fun.fun());
}
public int fun() {
int result;
try {
System.out.println("try语句块");
result = 1;
return result;
} catch (Exception e) {
System.out.println("catch语句块");
return 2;
} finally {
result=3;
System.out.println("finally语句块");
//return 3;
}
}
}
上面代码的执行结果是:
try语句块
finally语句块
1
这里执行了finally语句,result的值已经被改变为了3。但是这里注意,在try语句中执行return返回的result没有被立刻返回,因为它还没有执行完程序,没有执行finally语句。
所以,此时try语句中return的值会生成一个副本(暂且将它叫做result1),result1(这个副本)被存放在一个临时栈中。这就意味着存放的result1(副本)区别于还在执行程序中的result。result在finally语句中执行时,不会影响finally1(副本)的值。而当finally语句执行完,才会将临时栈中的result1(副本)的值返回。
所以程序结束时,虽然result的值已经被改变为3。但是执行try语句时已经将result=1生成存入临时栈,不会被后面result值得改变影响。故最终的返回值为临时栈中副本的值,为1 。
情况二:
public class Function {
public static void main(String[] args) {
Function fun = new Function();
System.out.println(fun.fun());
}
public int fun() {
int result;
try {
System.out.println("try语句块");
result = 1;
return result;
} catch (Exception e) {
System.out.println("catch语句块");
return 2;
} finally {
result=3;
System.out.println("finally语句块");
return 3;
}
}
}
上面代码执行结果:
try语句块
finally语句块
3
这里我们可以看到,仅仅是在finally语句中增加了return,最后返回的是finally中return的值。这说明finally中ruturn返回值会将之前存在临时栈中的值(例如情况一中的result1(副本))覆盖,所以最后返回finally语句中的return。
在这里可以理解为,顺序执行,并返回最后一次return的结果。
情况三:
public class Function {
public static void main(String[] args) {
Function fun = new Function();
System.out.println(fun.fun());
}
public int fun() {
int result;
try {
System.out.println("try语句块");
result = 12/0;
return 1;
} catch (Exception e) {
System.out.println("catch语句块");
return 2;
} finally {
result=3;
System.out.println("finally语句块");
//return 3;
}
}
}
上述代码执行结果:
try语句块
catch语句块
finally语句块
2
当正常的捕获异常时,代码运行的顺序就是try->catch->finally依次执行,并最终返回return的值。
由上述三种情况我们可以推断出情况四,当捕获异常,并且finally中有return时,代码会try->catch->finally依次执行,最终返回finally中return的值。
其他情况还没有遇到,遇到后会及时补充。
最后不足的地方希望大家指正!