-
Throwable、Error 與 Exception
-
所有的異常類型都繼承自
java.lang.Throwable
。 -
其中
Error
(比如OutOfMemoryError
、StackOverflowError
、類加載失敗等)表示 JVM 自身或運行環境的問題,不應該也通常無法由應用程序去捕獲或恢復,出現Error
通常意味著程序無法繼續安全運行。 -
Exception
則代表應用層“可感知”的問題。
-
-
Checked Exception 與 Unchecked Exception
-
Checked Exception(受檢異常)都是直接繼承自
Exception
但不繼承自RuntimeException
的異常。編譯器強制要求方法要么throws
出去,讓調用者去處理(聲明式),要么在方法內部用try–catch
捕獲并處理,否則代碼都無法通過編譯。 -
Unchecked Exception(非受檢異常)指的是繼承自
RuntimeException
或Error
的異常,編譯器不強制你捕獲或聲明。最常見的如NullPointerException
、ArrayIndexOutOfBoundsException
、IllegalArgumentException
等。
-
-
為什么要設計 Checked Exception?
-
可恢復性:Checked 異常通常表示“外部環境或 IO 操作”這類有可能因外部條件(文件不存在、網絡中斷、權限不足等)而失敗的場景。這類錯誤是可預見、有可能恢復的,Java 通過編譯期強制你去“面對”這些錯誤——要么捕獲,要么往上拋,讓調用鏈上的某一層來決定如何恢復或提示用戶。
-
增強 API 明示性:當一個方法聲明了
throws IOException
,調用者一眼就能知道“這個方法存在讀寫失敗的風險,需要處理或傳遞異常”,有助于寫出更健壯的程序。 -
并不是因為“底層不安全”,而是因為它們涉及到對程序外部資源的訪問(文件、網絡、數據庫、線程等待等),在這些操作中失敗是常態,而不是程序 bug,需要業務層去合理應對。
-
Throwable類有哪些常見方法:
1.getMessage()
2.toString()
3.printStackTrace()
4.getLocalizedMessage()
-
getMessage()
取得最初傳入的錯誤詳情(構造時的那條 String)。String msg = e.getMessage();
-
toString()
默認實現返回getClass().getName() + ": " + getMessage()
,可用于快速打印異常類型和信息。System.out.println(e.toString());
-
getLocalizedMessage()
可被子類覆蓋,用于返回基于當前環境(如不同語言)的錯誤信息。String localMsg = e.getLocalizedMessage();
-
printStackTrace()
將完整的異常棧信息輸出到標準錯誤流(或指定的PrintStream
/PrintWriter
),方便定位出錯位置。e.printStackTrace(); // 默認輸出到 System.err e.printStackTrace(System.out); // 輸出到控制臺標準輸出