finally中的代码块是无论怎样都会被执行的,那么如果遇到return呢,还会被执行吗?
答案是,会的。
return就意味着要结束方法体了,finally又是无论怎样都会被执行的,所以可以认为finally代码块是在返回之前执行的。
上代码:
public class TestsForAny {
public static void main(String[] args) {
System.out.println("result of whenFinallyExecute is:"+whenFinallyExecute());
}
public static int whenFinallyExecute() {
int aNumber = 1;
try {
System.out.println("try something");
return ++aNumber;
}
catch (Exception e) {
aNumber = 10;
System.out.println("catch something");
}
finally {
++aNumber;
System.out.println("final" + "Anum is:" + aNumber);
}
System.out.println("last block");
return aNumber;
}
}
执行结果:
可以看到,finally在return之前被执行了,但是没有对try代码块中的返回结果产生影响。
那try呐,是什么样子的?
上代码:
public class TestsForAny {
public static void main(String[] args) {
System.out.println("result of testTryReturn is:" + testTryReturn ());
}
public static int testTryReturn() {
int aNumber = 1;
try {
System.out.println("try something");
aNumber = aNumber/0;
return ++aNumber;
}
catch (Exception e) {
++aNumber;
System.out.println("catch something");
return aNumber;
}
finally {
aNumber = aNumber + 10;
System.out.println("finally");
}
}
}
运行结果:
结果是2,说明catch里面的return是会对最终结果产生影响的。
那如果finally里面也有return呢?
上代码:
public class TestsForAny {
public static void main(String[] args) {
System.out.println("result of testFinallyReturn is:" + testFinallyReturn());
}
public static int testFinallyReturn() {
int aNumber = 1;
try {
System.out.println("try something");
aNumber = aNumber/0;
return ++aNumber;
}
catch (Exception e) {
++aNumber;
System.out.println("catch something");
return aNumber;
}
finally {
aNumber = aNumber + 10;
System.out.println("finally");
return aNumber;
}
}
}
运行结果:
结果为12,finally里面有return,就可以影响最终结果了、
所以,finally最终总是会被执行,在finally之前遇到return会在先执行finally然后return,并且不会对return结果产生影响。如果在finally之后遇到return或者finally中本身包含return,是可以对结果产生影响的。