文章目錄
- 187. Java 異常 - 什么是異常?
- 🚨 什么是“異常”?
- ? 定義:
- 🧱 異常對象中包含什么?
- Java 是怎么“處理”異常的?
- 🧯 什么是異常處理器(Exception Handler)?
- 🧭 示例:調用棧中的異常傳遞過程
- ?? 如果沒人處理異常會怎樣?
- 💡 為什么使用異常比傳統錯誤碼更好?
- 🔍 常見異常類型
- 🧾 小結
- 🎯 建議實踐
187. Java 異常 - 什么是異常?
🚨 什么是“異常”?
在程序運行過程中,有些情況是“非正常的” —— 比如文件找不到、除數為零、數組越界……這些突發事件打斷了程序原本的運行流程,這就是 異常(Exception)。
? 定義:
異常是程序運行時發生的、打斷正常執行流程的一種事件。
當異常發生時:
- 當前方法會 創建一個異常對象,這個對象封裝了錯誤信息;
- 然后將這個對象 拋給 Java 運行時系統;
- 運行時系統會尋找可以“處理”這個異常的代碼塊。
這個過程被稱為:拋出異常(throwing an exception)。
🧱 異常對象中包含什么?
異常對象中通常包含以下信息:
- 異常的類型(如
NullPointerException
、IOException
等) - 錯誤發生時的程序狀態(棧軌跡、具體位置等)
- 可選的錯誤消息(
message
)
Java 是怎么“處理”異常的?
關鍵概念:調用棧(Call Stack)
可以想象程序運行是一個“方法接著方法調用”的過程。發生異常時,Java
會沿著調用棧往上“尋找處理者” 👇
main() → methodA() → methodB() → methodC() ← 異常發生在這里
Java 會從 methodC
開始,逐層往上查找,尋找能處理此異常的方法。
🧯 什么是異常處理器(Exception Handler)?
異常處理器是一段能夠“捕獲并處理”異常的代碼塊。通常使用 try-catch
語句編寫:
try {// 可能出錯的代碼int result = 10 / 0;
} catch (ArithmeticException e) {// 處理異常的代碼System.out.println("算術異常:除數不能為0!");
}
如果某個方法能處理該異常類型,它就 “捕獲(catch)” 了這個異常,程序可以繼續運行。
🧭 示例:調用棧中的異常傳遞過程
public class Demo {public static void main(String[] args) {methodA();}public static void methodA() {methodB();}public static void methodB() {methodC();}public static void methodC() {int result = 10 / 0; // ArithmeticException}
}
此代碼運行時會報錯:
Exception in thread "main" java.lang.ArithmeticException: / by zeroat Demo.methodC(Demo.java:14)at Demo.methodB(Demo.java:10)at Demo.methodA(Demo.java:6)at Demo.main(Demo.java:2)
? Java
沿著調用棧找,但沒有任何一個方法提供處理器,所以程序崩潰。
?? 如果沒人處理異常會怎樣?
如果異常從最底層冒到最頂層(main
方法),仍無人處理:
- 當前線程終止
- 如果是主線程 → 整個程序崩潰
💡 為什么使用異常比傳統錯誤碼更好?
傳統方式(C 風格):
int status = doSomething();
if (status == -1) {// 錯誤處理邏輯
}
Java 異常的優勢在于:
特點 | 好處 |
---|---|
? 非常規返回值 | ? 不影響主邏輯的返回 |
? 忽略容易 | ? 統一強制檢查 |
? 錯誤信息不集中 | ? 異常對象封裝信息 |
? 嵌套判斷混亂 | ? try-catch 語義清晰 |
🔍 常見異常類型
異常類型 | 說明 |
---|---|
NullPointerException | 訪問 null 引用的方法或字段 |
ArrayIndexOutOfBoundsException | 數組越界 |
ArithmeticException | 除以零等算術錯誤 |
IOException | I/O 操作失敗 |
ClassNotFoundException | 類未找到 |
🧾 小結
- 異常是運行時的問題,用對象表示,用拋出(
throw
)來傳播。 Java
使用調用棧尋找可以處理異常的代碼塊。try-catch
是處理異常的標準方式。- 異常使得錯誤處理邏輯與業務邏輯解耦,提升了代碼清晰度。
🎯 建議實踐
? 編寫以下代碼練習理解異常處理:
public class TestException {public static void main(String[] args) {try {int[] arr = {1, 2, 3};System.out.println(arr[3]); // 越界} catch (ArrayIndexOutOfBoundsException e) {System.out.println("數組越界了!");e.printStackTrace(); // 查看異常軌跡}System.out.println("程序繼續執行...");}
}