
前言
- 在
Java中,不同情形下return和finally的執(zhí)行順序很多人混淆不清 - 本文全面 & 詳細(xì)解析不同情形下
return和finally的執(zhí)行順序,希望你們會(huì)喜歡
目錄
- 儲(chǔ)備知識(shí)
- 終極結(jié)論
- 場(chǎng)景分析
- 總結(jié)
- 額外補(bǔ)充:final、finally和finallize的區(qū)別
1. 儲(chǔ)備知識(shí)
-
try / catch是常見(jiàn)的捕捉異常 & 處理的語(yǔ)句 - 只有
try語(yǔ)句中拋出異常,才會(huì)執(zhí)行catch中的語(yǔ)句
/**
* try中無(wú)拋出異常,則catch中的代碼不執(zhí)行
*/
try{
// 代碼無(wú)拋出異常
return result;
}catch(Exception e){
// catch代碼
}
/**
* try中拋出異常,則執(zhí)行catch中的語(yǔ)句
*/
try{
//代碼拋出異常
throw Exception;
return1 result1;
} catch(Exception e){
return2 result2; // 執(zhí)行catch中的語(yǔ)句
}
2. 終極結(jié)論
無(wú)論什么情況(異常與否、try / catch 前面存在return),finally塊代碼一定會(huì)執(zhí)行
必須謹(jǐn)記?。?/p>
3. 具體場(chǎng)景分析
下面,我將根據(jù)具體的使用場(chǎng)景來(lái)全面解析不同情形下return 和 finally的執(zhí)行順序
3.1 try 或 catch中存在return語(yǔ)句、finally無(wú)return語(yǔ)句
- 執(zhí)行順序 結(jié)論
return后的語(yǔ)句->finally語(yǔ)句 ->return結(jié)束函數(shù) & 返回值
finally語(yǔ)句不影響最終返回值,即返回值在finally前就決定
- 詳細(xì)講解
此處細(xì)分為2種情況:
a.try中有return、無(wú)拋出異常
b.try中有return、拋出異常 、catch有return
/**
* 情況1:try中有return、無(wú)拋出異常
* 實(shí)際執(zhí)行順序:
* 1. 執(zhí)行 try塊語(yǔ)句
* 2. 執(zhí)行 return后 的語(yǔ)句:得到結(jié)果result & 保存下來(lái)
* 3. 執(zhí)行 finally塊語(yǔ)句:不影響上述保存的返回值,哪怕修改了變量的值
* 4. 執(zhí)行 return,結(jié)束函數(shù),返回result的值:依舊返回步驟2保存的結(jié)果
*/
try{
//代碼無(wú)拋出異常
return result;
}catch(Exception e){
}finally{
// finally代碼
}
/**
* 情況2:try中有return、拋出異常 、catch有return
* 實(shí)際執(zhí)行順序:
* 1. 執(zhí)行 try塊語(yǔ)句
* 2. 執(zhí)行 throw 語(yǔ)句 :此時(shí)已拋出異常,運(yùn)行因異常而終止,故不執(zhí)行return1
* 3. 執(zhí)行 catch塊語(yǔ)句
* 4. 執(zhí)行 return2后 的語(yǔ)句:得到結(jié)果result2 & 保存下來(lái)
* 5. 執(zhí)行 finally塊語(yǔ)句:不影響上述保存的返回值,哪怕修改了變量的值
* 6. 執(zhí)行 return2,結(jié)束函數(shù),返回result2的值:依舊返回步驟4保存的結(jié)果
*/
try{
//代碼拋出異常
throw Exception;
return1 result1;
}catch(Exception e){
return2 result2;
}finally{
// finally代碼
}
3.2 finally中存在return語(yǔ)句(無(wú)論 try 或 catch之一 或 都存在return語(yǔ)句 )
- 執(zhí)行順序 結(jié)論
當(dāng)執(zhí)行到finally語(yǔ)句的return時(shí),程序就直接返回
finally中的return會(huì)覆蓋掉其它位置的return
- 詳細(xì)講解
此處細(xì)分為2種情況:
a.try&catch中都無(wú)return、無(wú)拋出異常 &finally中 有return
b.try/catch中任意1者 或 都有return(try中的return和catch中的return最多只有1個(gè)會(huì)執(zhí)行)、finally中 有return
/**
* 情況1:try & catch中都無(wú)return、無(wú)拋出異常 & finally中 有 return
* 實(shí)際執(zhí)行順序:
* 1. 執(zhí)行 try塊語(yǔ)句
* 2. 執(zhí)行 finally塊語(yǔ)句:會(huì)影響返回值
* 3. 執(zhí)行 return,結(jié)束函數(shù),返回result的值
*/
try{
}catch(Exception e){
}finally{
return result ;
}
/**
* 情況2:try / catch中任意1者 或 都有return(try中的return和catch中的return最多只有1個(gè)會(huì)執(zhí)行)、finally中 有 return
* 實(shí)際執(zhí)行順序:
* 1. 執(zhí)行 try塊語(yǔ)句:設(shè)無(wú)拋出異常,則不執(zhí)行catch語(yǔ)句 & return2
* 2. 執(zhí)行 return1 后 的語(yǔ)句:得到結(jié)果result & 保存下來(lái)
* 3. 執(zhí)行 finally塊語(yǔ)句:不影響上述保存的返回值,哪怕修改了變量的值
* 4. 執(zhí)行finally內(nèi)的 return3 后語(yǔ)句:finally中的return會(huì)覆蓋掉其它位置的return
* 5. 執(zhí)行return3 ,結(jié)束函數(shù),返回result3的值
*/
try{
//throw Exception;
return1 result1;
}catch(){
return2 result2;
}finally{
return3 result3;
}
特別注意
finally中的語(yǔ)句最好:
- 不要包含
return語(yǔ)句,否則程序會(huì)提前退出 - 返回值 ≠
try或catch中保存的返回值
至此,關(guān)于不同情形下return 和 finally的執(zhí)行順序 情況講解完畢。
4. 總結(jié)
本文主要講解了不同情形下return 和 finally的執(zhí)行順序,總結(jié)如下:

示意圖
5. 額外補(bǔ)充:final、finally和finallize的區(qū)別

歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū)!
分享Android技術(shù)干貨,追求短、平、快,但卻不缺深度。

請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力!
相關(guān)文章閱讀:Carson帶你學(xué)Android系列
Carson帶你學(xué)Android:學(xué)習(xí)方法
Carson帶你學(xué)Android:四大組件
Carson帶你學(xué)Android:自定義View
Carson帶你學(xué)Android:異步-多線程
Carson帶你學(xué)Android:性能優(yōu)化
Carson帶你學(xué)Android:動(dòng)畫(huà)