目录
一、Java 异常整体体系
二、第一大类:运行时异常 RuntimeException(重点)
1. NullPointerException 空指针异常
2. IllegalArgumentException 非法参数异常
3. IndexOutOfBoundsException 索引越界异常
4. ClassCastException 类型转换异常
5. IllegalStateException 非法状态异常
6. ArithmeticException 算术异常
7. NoSuchElementException 无元素异常
三、第二大类:受检异常 Checked Exception
1. IOException IO 异常(父类)
2. ParseException 日期解析异常
3. SQLException 数据库原生异常
4. ClassNotFoundException 类找不到异常
四、第三大类:Spring / 框架专属异常(SpringBoot/SSM 必见)
1. MethodArgumentNotValidException
2. HttpMessageNotReadableException
3. DuplicateKeyException
4. DataIntegrityViolationException
5. TimeoutException
五、第四大类:项目自定义异常(企业标配)
BusinessException 自定义业务异常
六、核心编码规范(直接落地使用)
1. 主动抛出异常场景
2. 防御型异常(只预判,不手动 throw)
3. 受检异常统一处理方案
4. 全局异常准则
5. 通用返回码映射表
- 传递规则:所有异常未被 try-catch 捕获,一律向上传递。
- 运行时异常:接口链路中一路上抛至 Controller,由全局异常统一处理。
- 受检异常:语法允许
throws上抛;企业规范强制底层捕获,包装为运行时异常再抛出。
一、Java 异常整体体系
所有异常根类:Throwable,分为两大分支
- Error:系统级致命错误(OOM、JVM 崩溃)
- 特点:代码无法捕获、无法处理,只能重启服务
- 开发中不用关注、不用编码处理
- Exception:业务 / 代码层面异常,日常开发核心
- 受检异常(Checked Exception):编译强制处理(
try-catch/throws),否则编译失败 - 运行时异常(RuntimeException):编译不强制处理,运行时才触发,业务代码主力使用
- 受检异常(Checked Exception):编译强制处理(
关键共识:两类异常都只会在代码运行时真正抛出;区别仅在于编译器是否强制提前编写处理代码。项目运行中,外部环境 / 数据变化,两类异常都可能突然触发。
二、第一大类:运行时异常RuntimeException(重点)
编译不强制处理,业务中可主动抛出,全局异常统一拦截。
1. NullPointerException 空指针异常
- 含义:对
null对象调用方法 / 属性 - 触发:对象、集合、字符串未判空直接使用
- 用法:防御优先(提前判空),禁止手动
throw - 前端返回码:
500系统异常
2. IllegalArgumentException 非法参数异常
- 含义:入参数值、范围、格式不符合业务规则
- 触发:负数、数值超限、参数非法
- 用法:参数校验首选,主动 throw
- 前端返回码:
400参数错误
3. IndexOutOfBoundsException 索引越界异常
- 子类:
ArrayIndexOutOfBoundsException(数组)、StringIndexOutOfBoundsException(字符串) - 触发:下标超过数组 / 字符串实际长度
- 用法:提前判断长度,防御为主
- 前端返回码:
500
4. ClassCastException 类型转换异常
- 含义:强制类型转换不匹配
- 触发:对象强转、泛型混用
- 用法:转换前用
instanceof判断,防御为主 - 前端返回码:
500
5. IllegalStateException 非法状态异常
- 含义:对象当前状态不允许执行操作
- 触发:订单已取消重复操作、迭代集合时增删元素
- 用法:业务状态校验可主动抛出
- 前端返回码:
400/ 自定义业务码
6. ArithmeticException 算术异常
- 触发:整数除以 0、数学计算错误
- 用法:计算前做判断,防御为主
- 前端返回码:
500
7. NoSuchElementException 无元素异常
- 触发:空集合、
Optional.empty()调用get() - 用法:使用工具类 /
Optional安全方法,防御为主 - 前端返回码:
500
三、第二大类:受检异常 Checked Exception
编译强制try-catch或throws,不处理则编译失败、项目无法启动;运行时遇到异常场景仍会触发,企业常规做法:底层捕获,包装为运行时异常再上抛。
1. IOException IO 异常(父类)
- 常用子类
FileNotFoundException:文件不存在(Excel 导入导出、读取配置文件高频)SocketException:网络断开、连接超时
- 触发:文件读写、网络请求、流操作
- 处理:底层工具类
try-catch,不逐层throws
2. ParseException 日期解析异常
- 触发:字符串与日期格式不匹配
- 场景:前端传日期、数据解析、定时任务
- 处理:日期工具类内部捕获,转为运行时异常
3. SQLException 数据库原生异常
- 触发:SQL 语法错误、数据库连接失败
- 补充:Spring/MyBatis 会自动包装为运行时异常,业务层几乎不用直接处理
4. ClassNotFoundException 类找不到异常
- 触发:反射加载类、依赖缺失
- 场景:框架底层,业务代码极少遇到
四、第三大类:Spring / 框架专属异常(SpringBoot/SSM 必见)
框架封装的运行时异常,由全局异常单独捕获。
1. MethodArgumentNotValidException
- 场景:
@Valid+ 注解校验(@NotNull/@NotBlank)失败 - 返回码:
400参数错误
2. HttpMessageNotReadableException
- 场景:前端 JSON 格式错误、字段类型不匹配
- 返回码:
400参数错误
3. DuplicateKeyException
- 场景:数据库主键 / 唯一索引重复(重复提交、重复注册)
- 返回码:自定义提示码
4. DataIntegrityViolationException
- 场景:数据库约束失败(非空字段传 null、外键错误)
- 返回码:
500
5. TimeoutException
- 场景:接口、Redis、数据库、RPC 请求超时
- 返回码:
504请求超时
五、第四大类:项目自定义异常(企业标配)
BusinessException 自定义业务异常
- 继承:
RuntimeException(运行时异常,无需编译处理) - 结构:内置自定义错误码 + 业务提示语
- 使用场景:
- 库存不足、权限不足、订单状态异常等业务规则拦截
- 区分普通参数错误和复杂业务错误
- 用法:业务逻辑不满足时主动
throw,全局异常单独捕获,返回自定义错误码
六、核心编码规范(直接落地使用)
1. 主动抛出异常场景
- 参数非法、数值越界 →
IllegalArgumentException - 业务规则拦截(库存、权限、状态)→
BusinessException - 对象状态非法 →
IllegalStateException
2. 防御型异常(只预判,不手动 throw)
空指针、索引越界、类型转换、除数为 0:代码提前校验,从源头避免。
3. 受检异常统一处理方案
IO、日期、文件等受检异常,底层工具类 try-catch,再包装为运行时异常向上抛出,避免throws逐层扩散。
4. 全局异常准则
- 业务层(Controller/Service)不写大量 try-catch,异常自动向上抛;
- 项目统一配置
@RestControllerAdvice全局异常处理器; - 全局异常中必须打印完整堆栈
log.error("描述", e),方便定位代码行号; - 按异常类型统一封装返回码与提示信息。
5. 通用返回码映射表
表格
| 异常类型 | 约定 Code | 含义 |
|---|---|---|
| IllegalArgumentException、MethodArgumentNotValidException | 400 | 参数错误 |
| 自定义 BusinessException | 业务自定义码 | 业务规则失败 |
| 空指针、SQL、IO 系统异常 | 500 | 服务内部错误 |
| TimeoutException | 504 | 请求超时 |