其实在java官方文档中有描述,当try语句块执行结束后是一定会执行finally的。因此一般情况下在finally中做一些关闭流的操作,因为try中的return,break,continue等都影响不到它,那么到底是怎么执行return又执行finally的呢,看代码:
public class Test01 {
public static void main(String[] args) {
int a = 0;
System.out.println(add(a));
}
public static int add(int b) {
try {
b++;
return b;
}catch(Exception e) {
System.out.println(" ");
}finally {
b++;
// return b;
}
return b;
}
}
为什么输出结果是1而不是2呢,JVM规范是这样解释的
If the try clause executes a return, the compiled code does the following:
- Saves the return value (if any) in a local variable.
- Executes a jsr to the code for the finally clause.
- Upon return from the finally clause, returns the value saved in the local variable.
就是说在try中存在return语句的情况下会先将返回值存到一个本地变量中,接下来再去执行finally代码块,虽然又做了一次b++,值变成了2,可最后返回的是存在本地变量的值 也就是b=1。
不过需要注意的是,如果是在finally中写了return语句,那么返回结果就是2了,因为规范中规定当try和finally中同时存在return会自动忽略try语句块中的而去使用finally中的return。
不过在finally中使用return也会有问题,这样会造成程序提前结束,具体的可以参考这个链接:在finally中写return会怎么样
总结:
- 执行try语句块后一定会执行finally。
- 当try和finally中同时存在return会忽略try的return而去执行finally的return。
- 不要在finally中写return语句。
参考自:https://www.cnblogs.com/xichji/p/12009222.html