
世界上不存在永遠不出錯的程序。可靠的程序必須處理好意外情況。
java的異常處理機制降低了編寫可靠程序的門檻。
當系統運行變慢,排查發生最頻繁的Excetion可以作為一種調優手段。
那么: Exception和Error有什么區別?
我是李福春,我在准備面試。
通過本篇,你可以學到下圖的知識點。

Java異常的類層級

在java體系中,Excetion和Error的關系如上,常見的子類也可見12;
Exception VS Error
先分開介紹:
Exception: 可以預見到的異常情況,應該被捕獲或者處理,在java中,分為檢查異常(編譯期)和不檢查異常(運行期)。
Error: 出現了錯誤系統不能正常運行或者恢復,一般情況不容易發生;
然后說共同點:都繼承自Throwable,在java中至於Throwable的子類可以被Catch或者Throw;
try-catch-finally
java提供的異常處理語法。
隨着java的發展,有更高級的語法優化。
try-with-resource : 自動關閉資源
multile exception: 相同種類的異常集中處理
代碼如下:
try (BufferedReader br = new BufferedReader(…);
BufferedWriter writer = new BufferedWriter(…)) {// Try-with-resources
// do something
catch ( IOException | XEception e) {// Multiple catch
// Handle it
}
在處理異常的時候,有4個基本規則需要注意:
- 不要catch 最普遍的Exception ,而應該優先捕獲具體的異常,可以留下足夠的診斷信息;
- 不要生吞異常,應該嘗試拋出或者寫到日志,否則無法判斷異常發生的位置;
- 不要使用e.printStackTrace(),在分布式系統中,無法確定輸出到了什么位置,應該輸出到日志中;
- 提早拋出,晚點捕獲;提高效率;
自定義異常
自定義異常的時候需要注意兩點:
1,盡量不要定義檢查異常
2,異常需要保留足夠的診斷信息,但是也需要脫敏;
異常影響性能
主要兩個原因:
- try-catch語句會影響jvm對代碼的優化,所以應該只包含必要的代碼段;
- 每次實例化一次Exception,jvm對線程棧進行一次快照,這是一個比較重的操作,非常耗費資源;
原創不易,轉載請注明出處。
