try块中包括的是不稳定的代码块。
当try块中的代码抛出异常的时候,catch块捕获异常并进行相应的处理。
无论try块中是否有异常,finally块都一定会执行,但可以没有finally块。
本文为了探究try-catch-finally的执行顺序及return结果,在案例中为了理解,只涉及简单的变量值的改变。
首先看一个例子:
int checkReturn1() {
int num=1;
try {
return ++num;
} catch (Exception e) {
return ++num;
} finally {
num=10;
num=20;
}
}
以上方法返回值是2,说明finally块对变量的修改对try块中没有影响。在执行finally块之前,会先将return的值存储起来,等到finally块执行完毕,再将原来存储的值进行返回,所以无论在finally块中如何修改变量值,返回的值都是原先try块中确定的值。
那么如果在finnally块中也有return的语句呢?
int checkReturn2() {
int num=1;
try {
return ++num;
} catch (Exception e) {
return ++num;
} finally {
num=10;
return ++num;
}
}
以上方法返回结果是11,说明程序返回的是finally块中的return语句,因此当finally块中有return语句的时候,会直接在finally就执行return操作了,而不会返回try块中执行return语句。
如果有异常呢?我们制造一个简单的除零异常
int checkReturn3() {
int num=1;
try {
num=1/0;
num=100;
return ++num;
} catch (Exception e) {
return num+10;
}
}
以上方法运行结果为11,说明try块中出现异常后的语句并不会执行,包括return语句。
finally块和catch块中都有return语句那么以谁为标准?
int checkReturn4() {
int num=1;
try {
num=1/0;
return ++num;
} catch (Exception e) {
num=num+10;
return num;
} finally {
num=num+100;
return num;
}
}
以上方法执行结果为111,说明最终执行的是finally块的return语句,且catch块中对变量的修改实际的影响了程序。
通过上述例子可以得出:只要finally块中有return语句,执行的就是finally块中的return;如果finally块中没有return语句,无论是否有异常,finally块中对返回变量的修改都不会生效,实际的返回值还是try块或catch块中未执行finally块中的值。