早期程式語言(如 C)缺乏異常處理,通常靠返回特殊值或設置旗標判斷錯誤。隨系統規模擴大,這種方式成為大型可維護系統的阻礙。因此現代語言引入異常處理機制,Java 在 C++ 基礎上建立了完善的物件導向異常體系。
Java 中每個異常都是物件,屬於 Throwable 或其子類實例。方法拋出異常物件時,其中包含異常資訊,呼叫端可捕捉處理。
java.lang.Error 及其子類,指虛擬機相關嚴重問題(系統崩潰、動態連結失敗等),無法恢復或捕捉,導致應用中斷。java.lang.Exception 及其子類,指可被捕捉且可能恢復的情況(陣列越界、除零、I/O 錯誤等)。編譯器檢查:Java 強制要求捕捉或聲明所有非執行時異常(如 FileNotFoundException、IOException),因不處理可能導致嚴重後果;執行時異常(RuntimeException 子類)則不強制,因普遍且全捕捉會影響可讀性與效能。
Java 異常處理透過 try、catch、throw、throws、finally 實現。基本結構:
try {
// 可能拋出異常的程式碼
} catch (ExceptionType1 e) {
// 處理 ExceptionType1
} catch (ExceptionType2 e) {
// 處理 ExceptionType2
throw e; // 重新拋出
} finally {
// 無論是否發生異常皆執行
}
遇到 try 陳述,異常框架置入堆疊,直到所有 try 區塊完成。若內層 try 未處理某異常,堆疊展開尋找能處理的 try。catch 子句指定欲捕捉的異常型別。
throw new IllegalAccessException("demo");。執行後流程立即停止,後續陳述式暫緩執行。Error、RuntimeException 及其子類除外。若要主動拋出執行時異常,亦需用 throws 聲明。class ThrowsDemo {
static void procedure() throws IllegalAccessException {
System.out.println("inside procedure");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
try {
procedure();
} catch (IllegalAccessException e) {
System.out.println("caught " + e);
}
}
}
執行流程:main 呼叫 procedure,後者拋出異常,main 的 catch 捕捉並處理。