如题
我们都知道,finally在捕获异常的操作中,总是最后并且一定会执行的。那么,如果我在使用try finally的时候,如果try 给了一个return,那么还会不会执行finally呢?这里就来试一试。
finally的特性
- Finally代码不管有没有异常发生它都会执行。
- 没有异常发生的时候,在try内的代码执行结束后执行finally。
- 如果发生了异常并且给catch捕获,则在执行完catch之后执行finally。
- 如果有异常且未被捕获,则在异常被抛给上层之前执行。
- 事实上,不用try catch也可以直接执行 try finally。
那么如果我在try 里面使用 return 会怎样呢?
测试过程
代码如下:
public class demo {
public static void main(String[] args) {
int result = fun();
System.out.println("result = " + result);
}
public static int fun(){
int a = 6;
try{
return a;
}finally {
a = 10;
System.out.println("ret = " + a);
}
}
}
结果如下:

结论分析:
测试的结果是,finally里面的代码依然会被执行。但是,虽然给a赋值了6。但返回的值最终还是10。所以,即使在try里面使用了return,也依然会执行finally。但是finally无法改变return的值。
因为在执行的过程中, try执行到return,会先把a的值保存在一个临时变量中,等到finally执行完毕之后才会返回。因此finally无法改变最终的返回结果。
新问题引入
那么,如果我在finally里面也执行一个return呢?结果会怎样?
public class demo {
public static void main(String[] args) {
int a = fun();
System.out.println("a = " + a);
}
public static int fun(){
int a = 6;
try{
return a;
}finally {
a = 10;
return a;
}
}
}
结果如下:

结论分析:
这个时候try里面的return就会丢失。只会执行finally里面的return