java异常处理核心是分清error、checked exception、unchecked exception三类:error不捕获只预防;checked必须显式处理;unchecked重在预防而非捕获。聚焦npe、越界、类型转换、io、json/http五大高频场景,辅以带上下文的日志规范。

Java 经典异常场景的总结,核心在于分清类型、定位根源、对症处理,而不是堆砌报错信息或罗列所有异常。真正实用的总结要能指导日常编码和问题排查,重点覆盖高频、易错、影响大的几类。
按异常性质归类,明确处理原则
先区分三类根本不同的情况:
-
Error(错误):如
OutOfMemoryError、StackOverflowError。它们不是代码 bug,而是 JVM 或系统资源问题。不捕获、不重试,只做预防——调优堆内存、限制递归深度、监控资源使用。 -
Checked Exception(受检异常):如
IOException、SQLException。编译器强制你面对外部不确定性(文件可能不存在、网络可能中断)。必须显式处理:要么用try-catch做业务兜底(如返回默认值、记录告警),要么用throws向上声明,由调用方决定策略。 -
Unchecked Exception(非受检异常):如
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。它们是代码逻辑缺陷的信号,本应在开发/测试阶段暴露。处理重点是预防而非捕获:加空值校验、用泛型约束、避免裸强转、善用Optional和Objects.requireNonNull()。
聚焦五大高频场景,给出可落地的修正方式
不必记全 20 种异常,掌握以下五种就覆盖绝大多数线上问题:
-
空指针(NPE):检查入参是否为
null,集合是否已初始化,第三方返回值是否做了判空;优先用Objects.requireNonNull()或Optional,而不是等它崩了再catch。 -
数组/集合越界:访问前核对
array.length或list.size();循环用增强 for 或迭代器,避免手写索引;必要时用Math.min(index, list.size() - 1)安全取值。 -
类型转换失败:强制转换前必加
instanceof判断;用泛型替代原始集合;避免在运行时靠字符串名称做类型推断。 -
IO 异常:必须用
try-with-resources确保流关闭;捕获具体子类(如FileNotFoundException单独处理),而非笼统抓Exception;超时、重试、降级策略要前置设计。 -
JSON/HTTP 调用异常:区分网络层(
ConnectException)、协议层(JsonParseException)、业务层(HTTP 4xx/5xx);对可恢复错误(如 503)加指数退避重试,对客户端错误(如 400)立即返回明确提示。
异常信息要带上下文,日志要可追溯
一个没用的 e.printStackTrace() 或空 catch 块,比异常本身更危险。每次记录异常,至少包含:
- 发生位置(类名+方法+行号)
- 关键业务参数(如用户 ID、订单号、请求 URL)
- 异常原始消息 + 栈轨迹(用 SLF4J 的
logger.error("msg", e)) - 如果是自定义异常,构造时直接传入业务含义明确的 message,不拼接模糊描述
异常处理不是“把红字压下去”,而是让问题更快浮现、更容易定位、更少重复发生。从分类认知到场景修正,再到日志规范,环环相扣。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











