Java異常處理

Unchecked & Checked Exception

  • RuntimeException及其子類是Unchecked Exception:
    隨時可以拋出,編譯器不強制捕獲。如IllegalArgumentException、ClassCastException、ArrayIndexOutOfBoundsException、NullPointerException等。
  • 其他Exception是Checked Exception:
    函數定義中必須聲明throws,調用方必須處理,或throws或try catch。如IOException、InterruptedException、ParseException等。

處理異常

Unchecked Exception不需要處理,這裏只討論Checked Exception的處理方案。

  • 如何處理異常
    try catch後,寫日誌,執行相關邏輯。
  • 如何不處理異常
    在更高層面,因爲有了清晰的(業務)邏輯,往往會更清楚合適的的處理方式是什麼。所以可以暫不處理異常,繼續拋出。如果能,添加throws定義。否則將Checked Exception轉化成Unchecked Exception,在拋出。轉化時必須帶上Cause:throw new RuntimeException(checkedException);
  • 特別注意
    儘量不要捕獲類似 Exception 這樣的通用異常,而是應該捕獲特定異常。
    不要生吞異常。如果沒有把異常拋出來,也沒有輸出到日誌(Logger),程序可能在後續代碼以不可控的方式結束。
    除demo外,不能使用e.printStackTrace();輸出異常,應該使用日誌。

性能分析

  • try-catch 代碼段會產生額外的性能開銷,或者換個角度說,它往往會影響 JVM 對代碼進行優化,所以建議僅捕獲有必要的代碼段,儘量不要一個大的 try 包住整段的代碼;與此同時,利用異常控制代碼流程,也不是一個好主意,遠比我們通常意義上的條件語句(if/else、switch)要低效。
  • Java 每實例化一個 Exception,都會對當時的棧棧進行快照,這是一個相對比較重的操作。如果發生的非常頻繁,這個開銷就不能被忽略了。

參考文獻
https://time.geekbang.org/column/intro/82

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章