java中自定义异常与断言工具类联合使用的核心是:用自定义异常承载业务语义,用断言工具类封装校验逻辑,通过“抛出即断言失败”形成轻量、清晰、可维护的校验链路;自定义异常继承runtimeexception,支持错误码、动态消息和嵌套异常;断言工具类提供静态方法统一校验与抛出;全局异常处理器统一转换为标准化响应体;在dto入参、service开头、builder构建等关键位置主动调用,实现前置守门与快速失败。

Java 中自定义异常与断言工具类联合使用,核心在于:用自定义异常承载业务语义,用断言工具类封装校验逻辑,二者通过“抛出即断言失败”形成轻量、清晰、可维护的校验链路。不依赖框架也能落地,关键在分层设计。
定义语义明确的自定义异常
继承 RuntimeException,避免强制 try-catch,同时支持错误码、动态消息和嵌套异常:
- 命名体现业务场景,如
InsufficientBalanceException、UserLockedException - 构造器至少提供三种重载:
– 仅传错误码(如"BALANCE_INSUFFICIENT")
– 错误码 + 可变参数(用于填充提示,如"BALANCE_INSUFFICIENT", amount)
– 错误码 + 参数 + cause(便于排查上游问题) - 内部可持有一个
ErrorCode枚举,统一管理码值、默认消息、HTTP 状态码等
断言工具类聚焦校验与抛出
提供静态方法,把“条件判断 + 异常构造 + 抛出”三步合一,调用时只关注“要校验什么”和“为什么失败”:
-
Assert.notNull(obj, "用户对象不能为空")→ 抛IllegalArgumentException或业务异常 -
Assert.isTrue(account.isActive(), () -> new UserLockedException("账号已被锁定"))→ 延迟构造,避免无用对象创建 -
Assert.that(user.getAge() >= 18, ErrorCode.AGE_NOT_VALID)→ 直接关联枚举,消息与状态码自动注入
所有方法都应返回 void,符合断言语义——不成功则中断,不参与后续流程。
全局异常处理器统一收口
用 @ControllerAdvice 捕获自定义异常,转为标准化响应体:
- 对
BusinessException子类,提取错误码、填充后的消息、HTTP 状态码(来自枚举) - 对其他未预期异常(如
NullPointerException),记录日志并返回通用错误码,避免信息泄露 - 响应结构统一为:
{"code": "USER_NOT_FOUND", "msg": "用户不存在", "timestamp": "..."}
配合校验入口形成守门机制
断言不是补丁,而是前置防线。建议在以下位置主动调用:
- DTO 入参后第一行:
Assert.notNull(request, ErrorCode.REQUEST_NULL) - Service 方法开头校验核心状态:
Assert.isTrue(order.isPayable(), ErrorCode.ORDER_NOT_PAYABLE) - 领域对象构造或 Builder 的
build()方法中,确保对象创建即合法
这样能快速失败,避免无效计算和资源占用,也使业务主干逻辑更干净。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











