1. finally代码块中的程序一定会被执行
2. 如果try{}中有return语句,finally在return语句之前执行 (return意味着结束调用)
3. 如果finally中有return语句,则fianlly块中的return语句将覆盖别处的return语句
扩充知识:
如果在try中返回的数据类型是基本数据类型,在finally块中改变return的值对返回值没有任何影响;但是如果返回值类型是引用类型,则有影响。展示于下面的代码:
public static int test01() {
int re = 3;
try {
return re;
} catch (Exception e) {
return 0;
} finally {
re = 5;
System.out.println("test01中的finally被执行了");
}
}
public static StringBuffer test02() {
StringBuffer str = new StringBuffer("Hello");
try {
return str;
} catch (Exception e) {
return null;
} finally {
str.append(" World!");
System.out.println("test02中的finally被执行了");
}
}
public static void main(String[] args) {
int i = test01();
System.out.println(i);// 3
StringBuffer str = test02();
System.out.println(str);
}
执行结果:
test01中的finally被执行了
3
test02中的finally被执行了
Hello World!
解释:
程序在执行到return 时会首先将返回值存储在一个指定的位置, 其次去执行finally 块, 最后再返回。在方法test01中调用return 前, 先把result 的值3存储在一个指定的位置, 然后再去执行finally 块中的代码, 此时修改result 的值将不会影响到程序的返回结果。test02中, 在调用return 前首先把str存储到一个指定的位置, 由于str为引用类型, 因此在finally 块中修改s 将会修改程序的返回结果。