在 Java 程式開發中,異常是指程式運行過程中發生的非預期事件,它會干擾正常的指令流程。並非所有錯誤都是異常,錯誤有時可避免(如語法錯誤),而異常則是在運行時發生的問題,例如除以零、文件不存在、網絡中斷等。
try-catch 捕獲或 throws 拋出。RuntimeException 及其子類,通常由程式邏輯錯誤導致(如空指針、數組越界),編譯器不強制處理,建議從邏輯上避免。Error 及其子類,表示嚴重的系統級問題(如 JVM 內存溢出、棧溢出),程式通常無法恢復,也不應嘗試捕獲處理。Java 將所有異常視為對象,頂層父類是 java.lang.Throwable,下分兩大分支:
Error:嚴重錯誤,程式無法處理,JVM 通常會終止線程。Exception:程式可捕獲處理的異常,再細分為運行時異常(RuntimeException)和非運行時異常(受檢異常)。
Error vs Exception: Error 是災難性、致命的,程式無法控制;Exception 通常可被程式處理,且應盡可能處理。
受檢異常 vs 不受檢異常: 除
RuntimeException及其子類和Error外,其他Exception皆為受檢異常,編譯器強制處理;不受檢異常編譯器不強制。
當方法無法繼續執行時,創建異常對象(new Exception()),終止當前路徑,將異常引用拋給調用棧上層,由運行時系統尋找合適的處理器。
if (stu == null) { throw new NullPointerException(); }
運行時系統沿調用棧向上查找含有匹配 catch 塊的方法。若未找到,程式終止。
try:監聽區域,包裹可能拋出異常的代碼。catch:捕獲並處理特定類型的異常,可多重捕獲,按順序匹配第一個符合的。finally:總會執行(除非 JVM 退出),用於釋放資源(關閉連接、流)。注意 finally 中的 return 會覆蓋 try/catch 的返回。throw:在代碼中顯式拋出異常對象。throws:聲明方法可能拋出的異常,用於方法簽名。try {
// 可能拋出異常的代碼
int a = 1, b = 0;
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("除數不能為零:" + e.getMessage());
} finally {
System.out.println("清理資源");
}
捕獲時按聲明順序匹配,若拋出的異常屬於 catch 參數類型或其子類,則匹配成功。建議先捕獲具體異常,再捕獲通用異常。
如 ArithmeticException,無需手動 throw,JVM 會自動拋出。若不捕獲,程式將終止並打印棧跡蹤。