一、Java 异常总体结构(必会)
Throwable
├── Error (严重错误,程序无法处理)
└── Exception (异常,程序可以处理)
├── RuntimeException(运行时异常 / 非受检)
└── CheckedException(受检异常)
二、Error(错误)❌【不要捕获】
JVM 层面错误,捕获也没意义
| 异常 | 说明 |
|---|---|
| OutOfMemoryError | 内存溢出(最常见) |
| StackOverflowError | 栈溢出(递归过深) |
| NoClassDefFoundError | 类定义缺失 |
| InternalError | JVM 内部错误 |
| VirtualMachineError | 虚拟机错误总类 |
✅ 原则:
Error只记录日志,不 try-catch
三、Exception 分类总览(重点)
1️⃣ Checked Exception(受检异常)✅【必须处理】
编译期强制你处理
| 异常 | 典型场景 |
|---|---|
| IOException | IO 读写失败 |
| FileNotFoundException | 文件不存在 |
| SQLException | 数据库异常 |
| ClassNotFoundException | 反射加载类 |
| ParseException | 日期 / 文本解析 |
| InterruptedException | 线程中断 |
📌 特点:
- 必须
try-catch或throws - 多用于 外部资源
2️⃣ RuntimeException(运行时异常)🔥【最常见】
程序逻辑问题,不强制捕获
🧨 常见运行时异常大全
| 异常 | 说明 |
|---|---|
| NullPointerException | 空指针 |
| IndexOutOfBoundsException | 下标越界 |
| ArrayIndexOutOfBoundsException | 数组越界 |
| ClassCastException | 类型转换异常 |
| IllegalArgumentException | 非法参数 |
| IllegalStateException | 状态不合法 |
| ArithmeticException | 算术异常(除 0) |
| NumberFormatException | 字符串转数字失败 |
| ConcurrentModificationException | 并发修改 |
| UnsupportedOperationException | 不支持的操作 |
📌 Spring / MyBatis / Lambda 中 90% 都是它
四、按「业务层面」分类(架构设计常用)
1️⃣ 参数校验异常
IllegalArgumentException
MethodArgumentNotValidException
ConstraintViolationException
👉 常见于:
- Controller 参数校验
- DTO 校验失败
2️⃣ 业务异常(强烈建议自定义)⭐
public class BusinessException extends RuntimeException {
private final int code;
}
| 场景 | 示例 |
|---|---|
| 权限不足 | PermissionDeniedException |
| 数据不存在 | DataNotFoundException |
| 状态不允许 | InvalidStatusException |
| 重复提交 | DuplicateOperationException |
📌 业务异常 = 运行时异常
3️⃣ 数据层异常(DAO / MyBatis / JPA)
| 异常 | 说明 |
|---|---|
| SQLException | SQL 错误 |
| DataAccessException | Spring 数据异常父类 |
| DuplicateKeyException | 唯一索引冲突 |
| BadSqlGrammarException | SQL 语法错误 |
| OptimisticLockingFailureException | 乐观锁失败 |
4️⃣ 网络 / IO 异常
| 异常 | 场景 |
|---|---|
| IOException | 网络 / 文件 |
| SocketTimeoutException | 超时 |
| ConnectException | 连接失败 |
| UnknownHostException | DNS 失败 |
| HttpClientErrorException | 4xx |
| HttpServerErrorException | 5xx |
5️⃣ 并发 / 线程异常
| 异常 | 说明 |
|---|---|
| InterruptedException | 线程被中断 |
| ExecutionException | Future 执行异常 |
| TimeoutException | 超时 |
| RejectedExecutionException | 线程池拒绝 |
五、Spring / Web 常见异常(你项目里一定见过)
| 异常 | 说明 |
|---|---|
| MethodArgumentTypeMismatchException | 参数类型错误 |
| HttpMessageNotReadableException | JSON 解析失败 |
| MissingServletRequestParameterException | 参数缺失 |
| HttpRequestMethodNotSupportedException | 方法不支持 |
| BindException | 参数绑定失败 |
| NoHandlerFoundException | 404 |
👉 通常统一在:
@RestControllerAdvice
六、按「处理策略」分类(高级)
1️⃣ 可恢复异常
- 网络超时
- 资源暂不可用
- 并发失败(可重试)
👉 支持 重试 / 降级
2️⃣ 不可恢复异常
- 参数非法
- 业务状态错误
- 数据不一致
👉 直接失败
七、异常设计最佳实践(非常重要)
✅ 推荐
- 业务异常继承 RuntimeException
- 统一错误码
- Controller 层统一处理
- 日志只打一遍
❌ 不推荐
- 到处 try-catch
- catch Exception 吞异常
- 用异常控制流程
八、异常速查表(收藏级)
| 分类 | 是否捕获 |
|---|---|
| Error | ❌ 不捕获 |
| CheckedException | ✅ 必须 |
| RuntimeException | ⚠️ 统一处理 |
| 业务异常 | ✅ 全局处理 |
| 系统异常 | ✅ 记录 + 兜底 |
九、一句话总结 🧠
系统异常交给框架,业务异常自己定义,Error 永远别碰