188. Java 异常 - Java 异常处理规范
📜 什么是"Catch or Specify Requirement"?
Java 是一种强类型语言,对异常的处理有严格要求。
Java 编译器要求:
👉 凡是可能抛出受检异常(Checked Exception)的代码,要么捕获它(catch),要么声明它会抛出(specify throws)。
这就叫做:
🧠 Catch or Specify Requirement(捕获或声明要求)
✅ 两种满足方式
方法一:使用 try-catch
捕获异常
java
try {
FileReader reader = new FileReader("data.txt");
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
}
✅ 如果你知道如何处理异常,就用 try-catch 包住它。
方法二:使用 throws
声明异常
java
public void readFile() throws FileNotFoundException {
FileReader reader = new FileReader("data.txt");
}
✅ 如果你暂时不处理异常,可以声明它抛出,由调用者负责处理。
❌ 不遵守规则会怎样?
如果你既不捕获,也不声明,编译器会立刻报错!
例如:
java
// ❌ 编译失败!
FileReader reader = new FileReader("data.txt");
会报错:
java
Unhandled exception: java.io.FileNotFoundException
💡 哪些异常必须遵守这个规则?
Java
将异常分为三类,只有其中一种是 必须遵守 这个 Catch or Specify 规则的:
异常类型 | 是否必须捕获/声明 | 说明 |
---|---|---|
✅ 受检异常(Checked Exceptions ) |
是 | 由外部环境引发,比如 IO、数据库等 |
❌ 非受检异常(Unchecked Exceptions ) |
否 | 程序逻辑问题,比如除零、空指针 |
❌ 错误(Errors ) |
否 | 严重错误,不建议处理,比如内存溢出 |
📌 常见的 受检异常 举例:
异常 | 说明 |
---|---|
IOException |
文件、网络等 I/O 错误 |
SQLException |
数据库错误 |
FileNotFoundException |
文件找不到 |
ClassNotFoundException |
类未找到 |
🎬 示例对比:什么是"必须处理的"和"可以忽略的"
✅ Checked Exception(必须处理)
java
public void openFile() throws FileNotFoundException {
FileReader reader = new FileReader("abc.txt");
}
✔️ 编译时必须捕获或声明。
❌ Unchecked Exception(不强制处理)
java
public void divide() {
int x = 10 / 0; // ArithmeticException
}
✔️ 编译器不会强制处理。
🎯 实战建议
- ✅ 若异常可预测、可恢复(如文件找不到)→ 捕获处理
- ✅ 若你希望调用者决定怎么处理 → 使用
throws
抛出 - ⚠️ 别滥用
throws Exception
,要具体! - ❌ 不建议捕获
Error
,那是 JVM 层级严重问题(比如内存溢出)
🧾 小结
要点 | 说明 |
---|---|
📌 Catch or Specify Requirement | 受检异常必须 try-catch 或 throws 声明 |
🎯 只适用于 Checked Exception | 不适用于运行时异常和错误 |
🛠️ 违背规则会 编译失败 | 保证异常处理不被忽视 |
🤹 合理选择处理方式 | 业务逻辑中推荐处理可控异常 |