我们都知道在try-catch-finally中,try块先执行,如果捕获到异常,则执行catch块,如果没有捕获到异常,那么catch块始终不执行,在catch块执行完之后,finally块最后执行。
则那么问题来了(假设都没有捕获异常)
1,如果try块中有return语句,那么finally会执行吗?
答案:会(实践在后面)
2,如果finally块中改变了try块中的return语句要返回的值,那么返回值会改变吗?
答案:不会(实践在后面)
3,如果finally块中有return语句,那么函数会通过try块中的return返回还是通过try块中的return返回?
答案:通过finally块中的return返回。
实践:
写一个简单的类,包含两个方法
public class FinallyReturn {
public static void main(String[] args) {
int num = getNum();
System.out.println("最后返回值是" + num);
}
private static int getNum(){
int num = 4;
try{
num = num + 1;
return num;
}catch(Exception e) {
e.printStackTrace();
}finally{
System.out.println("finall执行了!");
num = num + 100;
System.out.println("finall修改num为:" + num);
}
//这句在这里执行不到
return 0;
}
}
执行结果图:
由图可知:try块中有return的时候,finally还是会执行,
返回的结果是5
,说明finally块修改了num的值,但是不影响最后的函数返回值。
再来看另外一种情况,和上面代码差不多,只是在finally里面加了一句return num
:
public class FinallyReturn {
public static void main(String[] args) {
int num = getNum();
System.out.println("最后返回值是" + num);
}
private static int getNum(){
int num = 4;
try{
num = num + 1;
return num;
}catch(Exception e) {
e.printStackTrace();
}finally{
System.out.println("finall执行了!");
num = num + 100;
System.out.println("finall修改num为:" + num);
return num;
}
}
}
来看结果
由图可知,如果try块与finally块中都有return的时候,函数通过finally块中的return语句返回。