188. Java 异常 - Java 异常处理规范

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 不适用于运行时异常和错误
🛠️ 违背规则会 编译失败 保证异常处理不被忽视
🤹 合理选择处理方式 业务逻辑中推荐处理可控异常
相关推荐
毕设源码_廖学姐1 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
木斯佳1 小时前
前端八股文面经大全:26届秋招滴滴校招前端一面面经-事件循环题解析
前端·状态模式
光影少年1 小时前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
野犬寒鸦2 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
saber_andlibert3 小时前
TCMalloc底层实现
java·前端·网络
逍遥德3 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
冻感糕人~3 小时前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions3 小时前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子3 小时前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘3 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d