文章目錄
- 188. Java 異常 - Java 異常處理規范
- 📜 什么是“Catch or Specify Requirement”?
- ? 兩種滿足方式
- 方法一:使用 `try-catch` 捕獲異常
- 方法二:使用 `throws` 聲明異常
- ? 不遵守規則會怎樣?
- 💡 哪些異常必須遵守這個規則?
- 📌 常見的 **受檢異常** 舉例:
- 🎬 示例對比:什么是“必須處理的”和“可以忽略的”
- ? Checked Exception(必須處理)
- ? Unchecked Exception(不強制處理)
- 🎯 實戰建議
- 🧾 小結
188. Java 異常 - Java 異常處理規范
📜 什么是“Catch or Specify Requirement”?
Java 是一種強類型語言,對異常的處理有嚴格要求。
Java 編譯器要求:
👉 凡是可能拋出受檢異常(Checked Exception)的代碼,要么捕獲它(catch),要么聲明它會拋出(specify throws)。
這就叫做:
🧠 Catch or Specify Requirement(捕獲或聲明要求)
? 兩種滿足方式
方法一:使用 try-catch
捕獲異常
try {FileReader reader = new FileReader("data.txt");
} catch (FileNotFoundException e) {System.out.println("文件未找到!");
}
? 如果你知道如何處理異常,就用 try-catch 包住它。
方法二:使用 throws
聲明異常
public void readFile() throws FileNotFoundException {FileReader reader = new FileReader("data.txt");
}
? 如果你暫時不處理異常,可以聲明它拋出,由調用者負責處理。
? 不遵守規則會怎樣?
如果你既不捕獲,也不聲明,編譯器會立刻報錯!
例如:
// ? 編譯失敗!
FileReader reader = new FileReader("data.txt");
會報錯:
Unhandled exception: java.io.FileNotFoundException
💡 哪些異常必須遵守這個規則?
Java
將異常分為三類,只有其中一種是 必須遵守 這個 Catch or Specify 規則的:
異常類型 | 是否必須捕獲/聲明 | 說明 |
---|---|---|
? 受檢異常(Checked Exceptions ) | 是 | 由外部環境引發,比如 IO、數據庫等 |
? 非受檢異常(Unchecked Exceptions ) | 否 | 程序邏輯問題,比如除零、空指針 |
? 錯誤(Errors ) | 否 | 嚴重錯誤,不建議處理,比如內存溢出 |
📌 常見的 受檢異常 舉例:
異常 | 說明 |
---|---|
IOException | 文件、網絡等 I/O 錯誤 |
SQLException | 數據庫錯誤 |
FileNotFoundException | 文件找不到 |
ClassNotFoundException | 類未找到 |
🎬 示例對比:什么是“必須處理的”和“可以忽略的”
? Checked Exception(必須處理)
public void openFile() throws FileNotFoundException {FileReader reader = new FileReader("abc.txt");
}
?? 編譯時必須捕獲或聲明。
? Unchecked Exception(不強制處理)
public void divide() {int x = 10 / 0; // ArithmeticException
}
?? 編譯器不會強制處理。
🎯 實戰建議
- ? 若異常可預測、可恢復(如文件找不到)→ 捕獲處理
- ? 若你希望調用者決定怎么處理 → 使用
throws
拋出 - ?? 別濫用
throws Exception
,要具體! - ? 不建議捕獲
Error
,那是 JVM 層級嚴重問題(比如內存溢出)
🧾 小結
要點 | 說明 |
---|---|
📌 Catch or Specify Requirement | 受檢異常必須 try-catch 或 throws 聲明 |
🎯 只適用于 Checked Exception | 不適用于運行時異常和錯誤 |
🛠? 違背規則會 編譯失敗 | 保證異常處理不被忽視 |
🤹 合理選擇處理方式 | 業務邏輯中推薦處理可控異常 |