异常的分类大全

19 阅读3分钟

一、Java 异常总体结构(必会)

Throwable
├── Error              (严重错误,程序无法处理)
└── Exception          (异常,程序可以处理)
    ├── RuntimeException(运行时异常 / 非受检)
    └── CheckedException(受检异常)

二、Error(错误)❌【不要捕获】

JVM 层面错误,捕获也没意义

异常说明
OutOfMemoryError内存溢出(最常见)
StackOverflowError栈溢出(递归过深)
NoClassDefFoundError类定义缺失
InternalErrorJVM 内部错误
VirtualMachineError虚拟机错误总类

原则

Error 只记录日志,不 try-catch


三、Exception 分类总览(重点)

1️⃣ Checked Exception(受检异常)✅【必须处理】

编译期强制你处理

异常典型场景
IOExceptionIO 读写失败
FileNotFoundException文件不存在
SQLException数据库异常
ClassNotFoundException反射加载类
ParseException日期 / 文本解析
InterruptedException线程中断

📌 特点:

  • 必须 try-catchthrows
  • 多用于 外部资源

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)

异常说明
SQLExceptionSQL 错误
DataAccessExceptionSpring 数据异常父类
DuplicateKeyException唯一索引冲突
BadSqlGrammarExceptionSQL 语法错误
OptimisticLockingFailureException乐观锁失败

4️⃣ 网络 / IO 异常

异常场景
IOException网络 / 文件
SocketTimeoutException超时
ConnectException连接失败
UnknownHostExceptionDNS 失败
HttpClientErrorException4xx
HttpServerErrorException5xx

5️⃣ 并发 / 线程异常

异常说明
InterruptedException线程被中断
ExecutionExceptionFuture 执行异常
TimeoutException超时
RejectedExecutionException线程池拒绝

五、Spring / Web 常见异常(你项目里一定见过)

异常说明
MethodArgumentTypeMismatchException参数类型错误
HttpMessageNotReadableExceptionJSON 解析失败
MissingServletRequestParameterException参数缺失
HttpRequestMethodNotSupportedException方法不支持
BindException参数绑定失败
NoHandlerFoundException404

👉 通常统一在:

@RestControllerAdvice

六、按「处理策略」分类(高级)

1️⃣ 可恢复异常

  • 网络超时
  • 资源暂不可用
  • 并发失败(可重试)

👉 支持 重试 / 降级


2️⃣ 不可恢复异常

  • 参数非法
  • 业务状态错误
  • 数据不一致

👉 直接失败


七、异常设计最佳实践(非常重要)

✅ 推荐

  • 业务异常继承 RuntimeException
  • 统一错误码
  • Controller 层统一处理
  • 日志只打一遍

❌ 不推荐

  • 到处 try-catch
  • catch Exception 吞异常
  • 用异常控制流程

八、异常速查表(收藏级)

分类是否捕获
Error❌ 不捕获
CheckedException✅ 必须
RuntimeException⚠️ 统一处理
业务异常✅ 全局处理
系统异常✅ 记录 + 兜底

九、一句话总结 🧠

系统异常交给框架,业务异常自己定义,Error 永远别碰