点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事
本文来自CSDN博客专家Carson_Ho的博文,如需转载,请联系原文作者,点击文末“阅读原文”可直接访问作者博客。
在Java中,不同情形下return和finally的执行顺序很多人混淆不清。本文全面&详细解析不同情形下return和finally的执行顺序,希望你们会喜欢。
1. 储备知识
try / catch是常见的捕捉异常 & 处理的语句;只有try语句中抛出异常,才会执行catch中的语句。
/**
* try中无抛出异常,则catch中的代码不执行
*/
try{
// 代码无抛出异常
return result;
}catch(Exception e){
// catch代码
}
/**
* try中抛出异常,则执行catch中的语句
*/
try{
//代码抛出异常
throw Exception;
return1 result1;
} catch(Exception e){
return2 result2; // 执行catch中的语句
}
2. 终极结论
无论什么情况(异常与否、try / catch 前面存在return),finally块代码一定会执行。必须谨记!!
3.具体场景分析
下面,我将根据具体的使用场景来全面解析不同情形下return和finally的执行顺序
3.1 try或catch中存在return语句、finally无return语句
执行顺序,结论如下:
return后的语句-> finally语句 -> return结束函数 & 返回值
finally语句不影响最终返回值,即返回值在finally前就决定
详细讲解,此处细分为2种情况:
try中有return、无抛出异常;
try中有return、抛出异常 、catch有return。
/**
* 情况1:try中有return、无抛出异常
* 实际执行顺序:
* 1. 执行 try块语句
* 2. 执行 return后 的语句:得到结果result & 保存下来
* 3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
* 4. 执行 return,结束函数,返回result的值:依旧返回步骤2保存的结果
*/
try{
//代码无抛出异常
return result;
}catch(Exception e){
}finally{
// finally代码
}
/**
* 情况2:try中有return、抛出异常 、catch有return
* 实际执行顺序:
* 1. 执行 try块语句
* 2. 执行 throw 语句 :此时已抛出异常,运行因异常而终止,故不执行return1
* 3. 执行 catch块语句
* 4. 执行 return2后 的语句:得到结果result2 & 保存下来
* 5. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
* 6. 执行 return2,结束函数,返回result2的值:依旧返回步骤4保存的结果
*/
try{
//代码抛出异常
throw Exception;
return1 result1;
}catch(Exception e){
return2 result2;
}finally{
// finally代码
}
3.2 finally中存在return语句(无论try或catch之一或都存在return语句 )
执行顺序,结论:
当执行到finally语句的return时,程序就直接返回:
finally中的return会覆盖掉其它位置的return。
详细讲解,此处细分为2种情况:
try&catch中都无return、无抛出异常&finally中有return;
try/catch中任意1者或都有return(try中的return和catch中的return最多只有1个会执行)、finally中有return。
**
* 情况1:try & catch中都无return、无抛出异常 & finally中 有 return
* 实际执行顺序:
* 1. 执行 try块语句
* 2. 执行 finally块语句:会影响返回值
* 3. 执行 return,结束函数,返回result的值
*/
try{
}catch(Exception e){
}finally{
return result ;
}
/**
* 情况2:try / catch中任意1者 或 都有return(try中的return和catch中的return最多只有1个会执行)、finally中 有 return
* 实际执行顺序:
* 1. 执行 try块语句:设无抛出异常,则不执行catch语句 & return2
* 2. 执行 return1 后 的语句:得到结果result & 保存下来
* 3. 执行 finally块语句:不影响上述保存的返回值,哪怕修改了变量的值
* 4. 执行finally内的 return3 后语句:finally中的return会覆盖掉其它位置的return
* 5. 执行return3 ,结束函数,返回result3的值
*/
try{
//throw Exception;
return1 result1;
}catch(){
return2 result2;
}finally{
return3 result3;
}
特别注意,finally中的语句最好:
不要包含return语句,否则程序会提前退出;
返回值≠try或catch中保存的返回值。
至此,关于不同情形下return和finally的执行顺序 情况讲解完毕。
4. 总 结
本文主要讲解了不同情形下return和finally的执行顺序,总结如下:
---【End】---
推荐阅读:
print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!");
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!");
Response.Write("点个赞吧");
alert(’点个赞吧’)