finally 一定会执行吗?答案是否定的!
执行顺序
下面根据示例说下finally正常执行时候的顺序。
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result = "+testString2());
System.out.println("result = "+testFinal1());
}
public static StringBuffer testString2() {
StringBuffer sb = new StringBuffer("Hello");
try {
sb.append(" 111 ");
return sb;
}
finally {
sb.append("world!");
System.out.println("complete work!");
}
}
public static int testFinal1() {
int result=0;
try {
result =1;
return result;
}
catch(Exception e) {
result=2;
return result;
}
finally {
result=3;
System.out.println("execute finally");
}
}
}
执行结果如下:
complete work!
result = Hello 111 world!
execute finally
result = 1
由此可见: try语句中 如果要返回基本类型,在返回前会复制一份变量值,在finally里面修改这个变量的值将不起作用,返回引用的时候,可以被修改。
不执行的情况
1、直接返回,未执行到 try...finally 语句块
2、发生异常停止
i = i / 0;//抛出异常未执行到finally语句块
3、程序退出
System.exit(0);//系统退出未执行到finally语句块