目录

一、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,分为两大分支

  1. Error:系统级致命错误(OOM、JVM 崩溃)
    • 特点:代码无法捕获、无法处理,只能重启服务
    • 开发中不用关注、不用编码处理
  2. Exception:业务 / 代码层面异常,日常开发核心
    • 受检异常(Checked Exception):编译强制处理(try-catch / throws),否则编译失败
    • 运行时异常(RuntimeException):编译不强制处理,运行时才触发,业务代码主力使用

关键共识:两类异常都只会在代码运行时真正抛出;区别仅在于编译器是否强制提前编写处理代码。项目运行中,外部环境 / 数据变化,两类异常都可能突然触发


二、第一大类:运行时异常 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-catchthrows,不处理则编译失败、项目无法启动;运行时遇到异常场景仍会触发,企业常规做法:底层捕获,包装为运行时异常再上抛

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(运行时异常,无需编译处理)
  • 结构:内置自定义错误码 + 业务提示语
  • 使用场景:
    1. 库存不足、权限不足、订单状态异常等业务规则拦截
    2. 区分普通参数错误和复杂业务错误
  • 用法:业务逻辑不满足时主动 throw,全局异常单独捕获,返回自定义错误码

六、核心编码规范(直接落地使用)

1. 主动抛出异常场景

  • 参数非法、数值越界 → IllegalArgumentException
  • 业务规则拦截(库存、权限、状态)→ BusinessException
  • 对象状态非法 → IllegalStateException

2. 防御型异常(只预判,不手动 throw)

空指针、索引越界、类型转换、除数为 0:代码提前校验,从源头避免。

3. 受检异常统一处理方案

IO、日期、文件等受检异常,底层工具类 try-catch,再包装为运行时异常向上抛出,避免 throws 逐层扩散。

4. 全局异常准则

  1. 业务层(Controller/Service)不写大量 try-catch,异常自动向上抛;
  2. 项目统一配置 @RestControllerAdvice 全局异常处理器;
  3. 全局异常中必须打印完整堆栈 log.error("描述", e),方便定位代码行号;
  4. 按异常类型统一封装返回码与提示信息。

5. 通用返回码映射表

表格

异常类型 约定 Code 含义
IllegalArgumentException、MethodArgumentNotValidException 400 参数错误
自定义 BusinessException 业务自定义码 业务规则失败
空指针、SQL、IO 系统异常 500 服务内部错误
TimeoutException 504 请求超时

更多推荐