结论:
finally至少有两种情况不会被执行。
try语句没有被执行到。比如在try之前就返回了。
try块中使用了System.exit(0),这个语句会导致JVM退出
其他说明:
try块中有return,执行到该语句,会执行return的表达式,但是并不会直接返回,而是等finally块执行完才返回,所以finally块会在return(包括本身)之前的所有语句执行完再执行。
如果finally块中有return会覆盖try块中的return,此时如果存在finally后面的语句(包括return)都不可达。
当try-finally中有return语句,其外的return只有在发生异常时才起作用,所以并非不可达
在finally块中改变了return的变量,如果是基本类型更改无效(包括引用类型的置空操作)
如果发生异常会先执行catch块。如果中也有return,会同try的情况一样,会被finally的return覆盖
测试用例:
import java.util.HashMap;
import java.util.Map;
public class ReturnTest {
public static void main(String[] args) {
System.out.println("try块中语句没有被执行:");
System.out.println(nonexetry());
System.out.println("finally块中有return语句:");
System.out.println(directReturn());
System.out.println("finall块中改变了return的值(基础变量):");
System.out.println(changeReturnValue1());
System.out.println("finall块中改变了return的值(String变量):");
System.out.println(changeReturnValue2());
System.out.println("finall块中改变了return的值(非String的引用变量):");
System.out.println(changeReturnValue3().get("name"));
}
private static String exitIntry() {
try {
System.exit(0);
} finally {
return "cgz";
}
}
private static String nonexetry() {
if (25 > 3)
return "before try";
try {
return "in try";
} finally {
return "in finally";
}
}
private static Map changeReturnValue3() {
Map<String, Object> map = new HashMap();
map.put("name", "cgz");
try {
return map;
} finally {
map.put("name", "abc");
}
}
private static String changeReturnValue2() {
String s = "cgz";
try {
return s;
} finally {
s = "abc";
}
}
private static boolean changeReturnValue1() {
boolean b = true;
try {
return b;
} finally {
b = false;
}
}
private static boolean directReturn() {
try {
return true;
} finally {
return false;
}
}
}