Carson帶你學(xué)Java:一文帶你了解多種情形下return 和 finally的執(zhí)行順序


前言

  • Java中,不同情形下returnfinally的執(zhí)行順序很多人混淆不清
  • 本文全面 & 詳細(xì)解析不同情形下returnfinally的執(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)全面解析不同情形下returnfinally的執(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、拋出異常 、catchreturn
/**
  * 情況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者 或 都有returntry中的returncatch中的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ǔ)句最好:

  1. 不要包含return語(yǔ)句,否則程序會(huì)提前退出
  2. 返回值 ≠ trycatch中保存的返回值

至此,關(guān)于不同情形下returnfinally的執(zhí)行順序 情況講解完畢。


4. 總結(jié)

本文主要講解了不同情形下returnfinally的執(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à)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容