news 2026/6/12 3:07:12

Java 异常类 Exception

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 异常类 Exception

目录

一、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、MethodArgumentNotValidException400参数错误
自定义 BusinessException业务自定义码业务规则失败
空指针、SQL、IO 系统异常500服务内部错误
TimeoutException504请求超时
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 3:02:52

高寒地区分布式光伏箱变测控系统落地实战

在内蒙古呼伦贝尔的深冬,当气温骤降至零下三十度,大部分户外作业早已停滞,但对于新能源电站的建设者而言,工期不等人。华能伊敏煤电公司 24 兆瓦分布式光伏一期项目就面临着这样的极限挑战:不仅要在极寒环境中完成设备…

作者头像 李华
网站建设 2026/6/12 3:02:52

告别格式转换困境:Pandoc文档转换工具全面指南

告别格式转换困境:Pandoc文档转换工具全面指南 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 你是否曾经为了将一份Markdown技术文档转换成Word格式而头疼?或者需要将学术论文从LaTeX…

作者头像 李华
网站建设 2026/6/12 2:58:26

从‘电容分压’看米勒效应:一个简单模型帮你彻底理解MOSFET开关过程

从‘电容分压’看米勒效应:一个简单模型帮你彻底理解MOSFET开关过程第一次看到MOSFET数据手册中的Ciss、Coss、Crss参数时,我盯着那三个电容值发呆了半小时——它们究竟如何影响实际开关过程?直到把MOSFET想象成一个动态的电容分压器&#xf…

作者头像 李华
网站建设 2026/6/12 2:55:28

一键查询、换绑、解绑所有平台绑定的手机号

手机用久了,是不是总有些小麻烦?银行卡办过哪些记不清了?手机号绑了多少平台心里没底? 天分享一波亲测好用的网络技巧,全是干货,建议直接收藏,关键时刻绝对用得上! 技巧1:30秒查出你办过的所有银行卡! 怎么弄: 打开 云闪付APP -> 点底部 “我的” -> 找到 “…

作者头像 李华