Java异常处理核心是“识别—捕获—处理—预防”闭环:分清受检/非受检异常与Error的责任归属;精准捕获、分段处理、记录上下文;用try-with-resources自动关资源;自定义业务异常并统一拦截。

Java 异常处理实战演练不是堆砌语法,而是围绕真实场景反复练习“识别—捕获—处理—预防”闭环。关键在于分清异常类型、精准定位位置、给出有意义响应,而不是写满 try-catch。
明确每种异常该谁来管
先建立判断习惯:遇到异常,第一反应不是 catch,而是问“这是谁的责任?”
- 受检异常(如 IOException、SQLException):外部环境导致,必须显式处理。比如读文件失败,是系统资源问题,代码里得用 try-catch 或 throws 声明,不能忽略
- 非受检异常(如 NullPointerException、NumberFormatException):通常是逻辑疏漏,优先改代码预防。比如调用前判空、解析前校验字符串是否为数字,而不是等它抛出来再 catch
- Error(如 OutOfMemoryError):JVM 层面崩溃,不写 catch。重点是监控和预防——设好 JVM 参数、避免内存泄漏、限制递归深度
从一行出错开始练精准捕获
别用一个大 try 包裹整个方法。实战中要缩小 try 范围,让异常位置可定位、类型可区分。
- 读文件 + 解析数字?分开两段:文件操作单独 try-catch FileNotFoundException 和 IOException;数字转换单独 try-catch NumberFormatException
- 每个 catch 块只处理一种具体异常,记录上下文信息(比如“读取 config.json 第3行时解析失败,原始值='abc'”)
- 避免 catch(Exception e),它会掩盖真实问题;更不能只写 e.printStackTrace(),生产环境要用日志框架记录完整堆栈
用 try-with-resources 自动关资源
涉及流、连接、通道等需手动关闭的资源,不用再写 finally 里 close() —— 容易遗漏或二次 close 报异常。
立即学习“Java免费学习笔记(深入)”;
- 把资源声明在 try() 小括号里,JVM 保证无论是否异常都会自动调用 close()
- 例如:try (FileReader reader = new FileReader("data.txt")) { ... },哪怕中间 throw 了异常,reader 也会被安全关闭
- 注意:资源类必须实现 AutoCloseable 接口,常见 IO 类、JDBC 的 Connection/Statement 都支持
动手写一个业务异常并统一拦截
系统级异常(如空指针)暴露给用户没意义,应封装成带错误码、提示语的业务异常。
- 定义自定义异常类,继承 RuntimeException(非受检),含 code、message 字段,方便前端识别
- 在 Service 层主动 throw,比如余额不足时 throw new BizException(1002, "账户余额不足")
- 配合 @ControllerAdvice + @ExceptionHandler,在 Web 层统一转成标准 JSON 响应,避免重复 try-catch


















