面试的时候,经常会被问到finally的用法,是否一定会执行,有return的情况会怎么样?
大多数应该都认为finally 是一定会被执行的,其实不然。看下面的代码:
public int getNum() {
int num = 6;
if (num > 5) {
System.out.println(num);
return num;
}
try {
if (num > 5) {
System.out.println(num);
return num;
}
} catch (Exception e) {
// TODO: handle exception
}
finally {
System.out.println("我是finally");
}
return num;
}
通过测试发现,如果程序不执行try语句块,那么就不会执行finally。jvm具体如何操作,不知道。
下面讨论第二种情况,进了try语句块,finally还执行吗,是在return之后执行,还是return之前执行,通过断点测试:
会先执行return num; 进行返回,但没有返回,下一步跳到finally语句上,执行finally语句,最后再跳到return语句上进行返回。这一系列的步骤大家可以打断点测试一下,想深入研究可以自己研究一下JVM是如何工作的。
特殊情况:也不会执行finally
System.exit(0); 退出虚拟机,自然不会执行finally
线程中断。