假如在catch语句里面有return语句,请问finally里面的代码还会执行吗?如果执行是在return之前还是在return之后。
答:会执行在return之前。更准确的答案:在return之间执行。当在catch中遇到return语句时,就确定了一个返回的路径,接下来会判断finally里面还有没有代码,如果有,暂时搁置返回路径和返回内容,先去执行finally中的代码(没有return语句的时候),执行完成后,返回catch中的return路径,进行返回。这期间如果在finally中对返回的内容有修改,是不会影响到catch中返回内容的。这期间如果在finally中有return语句,那么程序将会在新的return路径中返回,将不再从catch中的return路径返回。
下面是代码例子:
public static void main(String[] args) {
int result = method3();
System.out.println(result);
}
private static int method3() {
int a = 10;
try {
System.out.println(a / 0);// 如果这里没有错误,将继续执行到“hello”,不会执行catch中的内容,跳到finally中继续执行,直到return。
System.out.println("a1:" + a);
System.out.println("hello");
} catch (ArithmeticException ae) {// catch语句仅仅代表一种可能性,
// 如果try中的语句出了catch标注的异常,将跳出try中的中断,执行catch中的语句
System.out.println("a2:" + a); // a2:10
a = 20;
return a; // 这个时候,在内存中就会有一个路径产生,该路径返回值是20.
// 但是,它看到了finally代码块,所以,继续执行finally里面的内容
// 当finally里面结束后(仅当finally中没有return语句),会回到以前的执行路径。
} finally {
System.out.println("a3:" + a); // a3:20
a = 30;
System.out.println("a4:" + a);
// return a;//如果这里的注释打开,下面的return必须去除,因为那将永远不会执行,是无效代码。
// 如果这里有return,程序将会从这里return,最终结果为30
}
return a;
}
|
|