1.首先,不管try...catch是否有异常或者有return,只要有finally,都是要执行的
2.当try有return 语句,没有产生异常时,执行到return语句时,会先算出return 表达式的值,并将其保存起来。注意,此时没有返回,只是计算表达式的值并保存起来,然后再去执行finally代码块,如果finally代码块有return 语句,程序执行到return语句,程序会提前结束,然后返回值,不会去执行try中的return
例如 try 中 有return a+b ,执行到这里只是将a+b的值保存起来。然后再去执行finally ,finally有return a+c ,那么程序执行到return a+c时,便会返回a+c的结果,不会再去执行try中的return.
3.当try有异常,catch有return语句时,程序执行到try中有异常的地方,异常被捕获,跳转到catch代码块,执行到return语句时,同样只是保存return 表达式的值,然后再去执行finally代码块。
4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
看完上面,如果还不理解,执行下面代码,一个一个去验证,都是能理解的
public class TryCatchTest {
public static void main(String[] args) {
// System.out.println("return的返回值:" + test());
System.out.println("包含异常return的返回值:" + testWithException());
// System.out.println("return的返回值:" + testWithObject().age); // 测试返回值类型是对象时
}
// finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值
//,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。
//也就是说方法的返回值是在finally运算之前就确定了的。
static int test() {
int x = 1;
try {
return x++;
} catch(Exception e){
}finally {
System.out.println("finally:" + x);//finally =2, 说明 try中return 后的表达式x++执行了
++x;
System.out.println("++x:" + x);//x=3
return x; //执行到这里,程序便结束,此时返回的值为3,即test()执行结果为3 。说明try中return不会被执行
//编译器把finally中的return语句标识为一个warning. 警告为'return' inside 'finally' block
//Inspection info: Reports return statements inside of finally blocks.
//While occasionally intended, such return statements may mask thrown exceptions and complicate debugging.
// 翻译为中文
// 'finally'块中的'return'
// 检查信息:报告finally块内部的返回语句。
// 虽然偶尔是有意的,但这样的返回语句可能会掩盖抛出的异常并使调试复杂化。
// 所以 finally代码中最好不要包含return.
}
}
static int testWithException(){
Integer x = null;
try {
x.intValue(); // 造个空指针异常
return x++;
} catch(Exception e){
e.printStackTrace();
System.out.println("catch:" + x);// x=null
x = 1;
return x; // 返回1
// return ++x; // 返回2
}finally {
x = 1;
System.out.println("finally:" + x);
++x;
System.out.println("++x:" + x);
// finally代码中最好不要包含return,程序会提前退出,
// 也就是说返回的值不是try或catch中的值
return x;
}
}
static Num testWithObject() {
Num num = new Num();
try {
return num;
} catch(Exception e){
}finally {
num.age++; // 改变了引用对象的值
System.out.println("finally:" + num.age); //num.age=1
}
return num;
}
static class Num{
public int age;
}
}