在Java中,異常(Exception)是一種在程序運行過程中出現的不正常情況。異常機制提供了一種從錯誤中恢復的途徑。異常分為兩大類:檢查異常(Checked Exception)和運行時異常(Runtime Exception)。此外,還有錯誤(Error),盡管它們在語義上和異常類似,但它們表示系統級的異常情況。
1. 異常分類
檢查異常(Checked Exception)
這些異常在編譯時由編譯器檢查。如果方法拋出一個檢查異常,必須要么捕獲它(使用 try-catch 塊),要么在方法簽名中聲明拋出它(使用 throws 關鍵字)。
常見的檢查異常類:
IOException
SQLException
ClassNotFoundException
FileNotFoundException
運行時異常(Runtime Exception)
這些異常在編譯時不進行檢查,只有在運行時拋出。這些異常通常是程序邏輯錯誤導致的,例如非法參數傳遞給方法等。
常見的運行時異常類:
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
IllegalArgumentException
ClassCastException
錯誤(Error)
這些是由Java虛擬機(JVM)拋出的嚴重錯誤,程序無法處理或恢復。例如,內存溢出(OutOfMemoryError)。錯誤通常表示系統級別的問題,程序不應該試圖捕獲這些錯誤。
常見的錯誤類:
OutOfMemoryError
StackOverflowError
VirtualMachineError
AssertionError
2. 異常類結構
在Java中,所有的異常類都繼承自 java.lang.Throwable
。Throwable
類有兩個重要的子類:Error
和 Exception
。其中,Exception
又進一步分為 RuntimeException
和其他檢查異常。
異常類層次結構:
java.lang.Object└── java.lang.Throwable├── java.lang.Error└── java.lang.Exception├── java.lang.RuntimeException└── 其他檢查異常
3. 常見異常類
檢查異常類(Checked Exception Classes):
java.io.IOException
:IO操作失敗或中斷。java.sql.SQLException
:數據庫訪問錯誤。java.lang.ClassNotFoundException
:無法找到指定的類。java.io.FileNotFoundException
:嘗試打開的文件不存在。
運行時異常類(Runtime Exception Classes):
java.lang.NullPointerException
:調用了空對象的屬性或方法。java.lang.ArrayIndexOutOfBoundsException
:數組下標越界。java.lang.ArithmeticException
:算術運算錯誤,如被零除。java.lang.IllegalArgumentException
:非法參數。java.lang.ClassCastException
:對象無法強制轉換到指定的類型。
錯誤類(Error Classes):
java.lang.OutOfMemoryError
:JVM沒有足夠的內存。java.lang.StackOverflowError
:方法調用棧溢出。java.lang.VirtualMachineError
:虛擬機發生內部錯誤。java.lang.AssertionError
:斷言失敗。
4. 自定義異常
有時候,標準的異常類不能完全描述問題,這時可以創建自定義異常類。自定義異常類通常繼承自 Exception
或 RuntimeException
。
自定義檢查異常示例:
public class CustomCheckedException extends Exception {public CustomCheckedException(String message) {super(message);}
}
自定義運行時異常示例:
public class CustomRuntimeException extends RuntimeException {public CustomRuntimeException(String message) {super(message);}
}
5. 異常處理示例
捕獲和處理異常:
public class ExceptionHandlingExample {public static void main(String[] args) {try {// 可能拋出檢查異常的方法checkedExceptionMethod();} catch (CustomCheckedException e) {System.out.println("Caught custom checked exception: " + e.getMessage());}try {// 可能拋出運行時異常的方法runtimeExceptionMethod();} catch (CustomRuntimeException e) {System.out.println("Caught custom runtime exception: " + e.getMessage());}}public static void checkedExceptionMethod() throws CustomCheckedException {throw new CustomCheckedException("This is a custom checked exception");}public static void runtimeExceptionMethod() {throw new CustomRuntimeException("This is a custom runtime exception");}
}
總結
- 檢查異常需要在編譯時處理或聲明,表示可以預期的異常情況。
- 運行時異常通常是編程錯誤,只有在運行時才會發現,不需要在編譯時處理。
- 錯誤是嚴重的系統級問題,程序不應嘗試處理。
- 可以通過繼承
Exception
或RuntimeException
創建自定義異常類,以更好地描述特定的異常情況。