// 思路:用return的相互覆盖就可以解决这个难题。
public class ReturnRecover{
public static void main(String[] args) {
//调用下面的方法
int n = fun(2);
System.out.println("打印fun()函数返回的n值= "+n);
}
public static int fun(int i)
{
try {
//发现异常
int m= i/0;
//异常直接被捕获,后面的不会执行。
return i++;
}
catch (ArithmeticException e){
System.out.println("异常信息:"+e);
System.out.println("catch 中的i = "+i);
return i+3; //返回的是 2+3, 而不是finally中对i的赋值再来加上3,
//finally中对i的操作,不会影响此时catch中的return i+3
}
finally {
i++;
i++;
System.out.println("finally 执行 "+i);
//return i+8; //如果这里没注释
//这里会返回12,而不会去返回catch中的 return i+3
}
}
}
/* 结论: 先执行return后执行finally
* 输出结果为:异常信息:java.lang.ArithmeticException: / by zero
* catch 中的i = 2
* finally 执行 4
* 打印fun()函数返回的n值= 5
* 结果分析:在执行try语句时,由于i/0是会报异常的,所以异常立马被catch捕获,for里面的return是不会执行的
* 执行catch语句内容,先输出两个语句,再执行return i+3; 此时i已经是5,所以主函数里面会打印n=5,
* finally中对i的操作,不会影响此时catch中的return i+3
* return执行完成后再执行finally,finally里面执行两次i++,所以输出的i值为4;
* 判断先后的方法:在finally里面加入了return i+8; 此时我们会发现主函数里面输出的是n=12,
* 如果是先执行的finally方法,catch里面的return 动作肯定会覆盖finally里面的,所以输出的肯定就不会是n=12
* 如果是先执行的try里面的return,输出的结果肯定就会被后来执行的finally方法所覆盖,输出就应该是n=12,满足代码结果
* 所以得出结论是:先执行的try里面的return ,后执行的finally方法。
*/ |
|