Java異常體系

從IOException中引出的問題:

  • Java的異常體系
    • 在return語句之外,為方法提供了一種額外的出口,即 throw Exception
    • IOException通常代表預(yù)期之內(nèi)的異常
  • 萬能解決方案
    1. 繼續(xù)throw
    2. try/catch

try/catch/finally

  • 如果沒有try,異常將擊穿所有的棧幀
  • catch可以將一個異常捕獲到
  • finally可以執(zhí)行清理工作
  • try-with-resources (JDK7以上)
    對于所有實現(xiàn)了AutoCloseable接口的對象,可以直接聲明在try()中,可以不必寫finally,JDK會自動關(guān)閉該對象

如果當前的方法中throw了Exception,但是又沒有可以處理的邏輯(try/catch),那么這個異常會一直擊穿所有的棧幀一直到被捕獲。

關(guān)于finally,無論在前面的try/catch里面做了什么樣的操作(例如return xxx;等),Java中的finally都一定會被執(zhí)行。且finally里面不建議使用return語句。還可以不寫catch(不建議),直接只寫try和finally

throw/throws

  • throw拋出一個異常
  • throws只是一個聲明,代表方法可能會丟出一個異常

Java的異常體系

  • Throwable: 可以被拋出的東西(有毒),為所有的錯誤和異常的父類
    • Exception: checked exception (受檢異常,有毒,代表預(yù)料之中的異常)
      • RuntimeException:(運行時異常,無毒,代表預(yù)料之外的異常)
    • Error:錯誤(無毒,代表嚴重的錯誤)

有毒和無毒的判定標準為,任何調(diào)用該方法的方法是否需要被迫繼續(xù)進行throw或者try/catch,有毒的即為checked exception,無毒的為unchecked exception

  • catch的級聯(lián)與合并
    catch可以連續(xù)寫多個catch語句,其中的異常類型順序要按照子類到父類即從小到大的來寫。另外對于相同的處理邏輯,catch語句還可以合并:
try {
  doSomething();
}catch(NullPointerException | IllegalAccessException e) {
  similarHandle();
}

Java的異常的棧軌跡

  • 棧軌跡:stack trace 排查問題最重要的信息
  • 異常鏈:查看報錯信息,caused by即為原始的異常,如有多個caused by,即最底層的為最原始的異常,其余的都是對異常進行了包裝處理。

異常的處理原則

  • 能用if/else處理的,不要用異常
    因為沒有辦法保證捕獲到的異常是你期望的異常
  • 盡早拋出異常
    如果當前方法不能處理異常,那么該立即拋出,不應(yīng)該再繼續(xù)寫之后的錯誤的處理邏輯
  • 異常要準確,帶有詳細的信息
  • 拋出異常也比不處理悄悄的執(zhí)行錯誤的邏輯要好
  • 先判斷本方法是否有責(zé)任處理該異常
    • 不要在一個方法里處理不歸自己管的異常
  • 再判定本方法是否有能力處理這個異常
    • 如果本方法不能處理,則拋出異常
  • 如非萬分必要,不用忽略異常

常見的JDK內(nèi)置異常

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

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

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