java方法应将非空校验置于入口,首选objects.requirenonnull统一处理null,字符串需额外用stringutils.isnotblank或trim()校验空白,集合须分别校验null和isempty,推荐结合hibernate validator声明式校验提升健壮性。

在 Java 方法设计中,把非空校验放在入口处,是防御性编程最基础也最关键的实践。核心目标不是“拦住所有错误”,而是让问题暴露得早、归因得准、修复得快——调用方一传 null,方法立刻报错,而不是跑几步后抛出难以定位的 NullPointerException。
用 Objects.requireNonNull 做标准 null 检查
这是官方推荐、语义清晰、性能友好的首选方式。它直接抛出 NullPointerException,但带明确提示信息,比裸判 if (obj == null) 更规范。
- 写法统一:
Objects.requireNonNull(param, "参数名不能为空") - 不建议手写
if (param == null) throw new IllegalArgumentException(...)—— 语义不符(null 是引用缺失,不是“参数值非法”) - 多个参数可链式调用,例如:
Objects.requireNonNull(name, "姓名不能为空");<br> Objects.requireNonNull(email, "邮箱不能为空");<br> Objects.requireNonNull(role, "角色不能为空");
字符串还要额外做“空白校验”
null 和空串("")、纯空格(" ")是两类问题。Objects.requireNonNull 只管 null,对空白字符串需单独处理。
- 推荐用 Apache Commons Lang 的
StringUtils.isNotBlank(str),一行搞定 null + 空 + 纯空格 - 若不想引入依赖,可用
str != null && !str.trim().isEmpty(),但注意 trim() 有开销,高频调用需评估 - 校验失败时仍抛
IllegalArgumentException,信息写清楚,比如:"用户名不能为空或仅含空白字符"
集合和数组也要防 null,但别误判空集合
集合类(List、Map、Set)常被误认为“只要不为 null 就安全”,其实很多业务逻辑要求非空且非空集合。
- 先 check null:
Objects.requireNonNull(items, "商品列表不能为空") - 再按需 check 业务空性:
if (items.isEmpty()) { throw new IllegalArgumentException("商品列表不能为空"); } - 不要把
isEmpty()当作 null 替代检查——两者语义不同,null 表示“根本没给”,empty 表示“给了但内容为空”
结合框架层统一拦截更省心
单靠手写校验容易遗漏,尤其在 Controller 层。建议搭配 JSR-380(Hibernate Validator)做声明式校验:
- DTO 字段加
@NotBlank、@NotNull、@NotEmpty等注解 - Controller 方法参数加
@Valid,非法请求直接 400 返回,不进 Service - 这样既保证入口强约束,又避免重复编码;手写校验聚焦在 Service 内部跨参数逻辑(如 “email 和 phone 至少填一个”)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











