共同點
都是從 Throwable 這個 Java 類繼承來的。Throwable 類也就衍生出這兩種類型。
不同點
Error:
表示編譯時和系統(tǒng)錯誤,指在正常情況下,不大可能出現(xiàn)的情況。絕大部分的 Error 都會導致程序不可恢復。
Exception:
是程序正常運行中,可以預料的意外情況,可能并且應該被捕獲,并進行相應的處理。
Exception 又分為檢查型異常 (check exception) 與 非檢查型異常 (unchecked exception) 。檢查型異常是在編譯期檢查,非檢查型異常就是運行時異常。運行時異常都是從 RuntimeException 繼承來的,這種異常屬于錯誤,將被自動捕獲。
補充
1、理解 Throwable、Exception、Error 的設計和分類。
面試官會追問一些細節(jié),如:你了解哪些 Error、Exception、RuntimeException? 重點了解一下常用的子類。
經(jīng)典問題:NoClassDefFoundError 與 ClassNotFoundException的區(qū)別。
NoClassDefFoundError 產(chǎn)生原因:如果 JVM 或者 ClassLoader 實例嘗試加載類的時候卻找不到類的定義,要查找的類在編譯期存在,運行時卻找不到,造成該問題的原因可能是打包過程露掉了部分類,或者 jar 包出現(xiàn)損壞或者篡改。
ClassNotFoundException產(chǎn)生原因:1.Java 支持反射方式在運行時動態(tài)加載類,例如使用 Class.forName() 方法來動態(tài)的加載類時,可以將類名作為參數(shù)傳遞到上述方法中,從而將指定類加載到 JVM 內(nèi)存中,如果這個類在類路徑中沒有被找到,就會拋出這個錯誤。常見問題在于書寫名錯誤;2.當一個類已經(jīng)被某個類加載器加載到內(nèi)存中了,另一個類加載器又嘗試著動態(tài)的從同一個包中加載這個類。通過控制動態(tài)類加載過程可以解決這個問題。
2、理解 Java 語言中操作 Throwable 的元素和實踐。
掌握最基本的語法同時也要懂得如何處理典型場景。
典型場景是什么呢?待補充
異常處理基本原則
1.盡量不要捕獲類似 Exception 這樣的通用異常,應該捕獲特定異常。
這樣寫為了讓自己代碼能夠體現(xiàn)出更多的信息。
2.不要生吞異常。
在工作中,如果發(fā)生異常,不要使用 e.printStackTrace() 來輸出異常,因為很難判斷輸出到哪里去了,最好使用產(chǎn)品日志,詳細的輸入到日志系統(tǒng)中。