Java自定义异常本身不简化非空校验,但通过封装工具方法、结合@Valid注解+全局处理器、自定义注解+AOP、Excel模板化校验四种方式,实现语义化、统一化、零侵入、场景化校验。

Java 自定义异常本身不直接“简化”非空校验,但它能让校验逻辑更清晰、错误处理更统一。真正简化的是:用自定义异常承载语义化错误,配合工具方法或注解机制,把“判空 + 抛异常”这一重复动作收口到一处。
封装带自定义异常的校验工具方法
避免每处都写 if (obj == null) throw new XxxException(...),而是封装成一行语义化调用:
- 定义工具类,如
Check.notNull(obj, "用户ID"),内部抛出你自己的IllegalArgumentException子类(如ParamMissingException) - 构造时自动拼接提示:
throw new ParamMissingException(field + " 不能为空") - 返回原对象,支持链式使用:
User user = Check.notNull(getUser(), "user").setActive(true); - 后续可横向扩展
notBlank()、positive()等,全部复用同一套异常体系
结合 @Valid 声明式校验 + 全局异常处理器
在 DTO 或 Excel 导入实体上用标准注解,让校验与业务代码彻底分离:
- 字段加
@NotBlank(message = "用户名不能为空")、@NotNull等 - Controller 方法参数标注
@Valid,Spring 自动触发校验 - 编写
@ControllerAdvice拦截MethodArgumentNotValidException - 在异常处理器中,将校验失败统一转为你的自定义异常(如
ValidationFailedException),并填充错误字段、消息、错误码
自定义注解 + AOP 实现零侵入参数校验
适合已有大量方法需补全校验,又不想改方法体的场景:
立即学习“Java免费学习笔记(深入)”;
- 定义注解
@RequireNonNull("id,name"),标注在 Service 方法上 - 用 AOP 切入,在执行前反射读取参数值,对指定字段名做非空判断
- 校验失败时,抛出你定义的
BusinessValidationException,含具体字段和上下文(如 method name、args) - 全局异常处理器捕获该异常,统一记录日志、返回前端友好结构
Excel 导入等特殊场景的模板化校验
针对 EasyExcel 等批量导入,可复用自定义异常构建轻量校验模板:
- 定义
@ExcelRequired注解,标记必填字段 - 写通用校验器
ExcelImportValidator.valid(rowObject) - 遍历字段,遇到
@ExcelRequired且值为null,立即抛出ExcelImportException("第3行:手机号不能为空") - 异常中可携带行号、字段名、原始值,便于前端定位和用户反馈


















