推荐用string.isblank()判断并转null,它安全覆盖null、空串、纯空白字符;java 7以下用stringutils.isblank()或显式判空+trim;dto/entity字段应通过lombok setter、spring @initbinder或mybatis plus metaobjecthandler统一处理;但不可盲目转null,需区分""(明确空值)与null(未设置)的语义差异。

Java中把空字符串设为null的常见误操作
直接写 str = "" 或 str.equals("") 后赋值 null,看似合理,但容易漏掉空白字符(如空格、制表符)、忽略对象为 null 时调用 equals 报 NullPointerException。真实业务里,用户输入框提交“只敲了空格”或后端返回带不可见字符的字符串很常见。
安全判断并转null的推荐写法(Java 8+)
用 String 自带的 isBlank() 最省心——它同时覆盖 null、空串、纯空白字符三种情况,且不会抛空指针:
if (str == null || str.isBlank()) {
str = null;
}
如果必须兼容 Java 7 或更早版本,改用 Apache Commons Lang 的 StringUtils.isBlank(str),效果一致;自己手写需显式判空再 trim:
-
str == null→ 直接设null -
str != null && str.trim().length() == 0→ 设null - 避免用
str.trim().equals(""),因为trim()返回新对象,每次创建开销略大
在DTO/Entity字段上统一处理的实践方式
手动在每个 setter 里写判空逻辑易遗漏,也难维护。更稳妥的做法是:
立即学习“Java免费学习笔记(深入)”;
- 用 Lombok 的
@Setter配合自定义方法:在 setter 中先校验再赋值 - Spring Boot 项目可用
@InitBinder+ 自定义PropertyEditor或Converter<string string></string>,全局拦截字符串参数 - MyBatis Plus 可通过
MetaObjectHandler在 insert/update 前对字段做预处理 - 注意:JPA 的
@PreUpdate/@PrePersist不适用于 setter 场景,它们只在持久化前触发,不改变内存中对象状态
为什么不该无脑把所有空字符串转null?
空字符串和 null 在语义上不同:null 表示“未设置/未知”,"" 可能表示“明确设置了空值”。比如用户资料中的“中间名”字段,留空是常见合法状态,强制转 null 可能让后续的 Optional.ofNullable() 或数据库 IS NULL 查询逻辑出错。
真正需要转 null 的场景通常是:前端传参冗余、接口契约约定“空即未提供”、或为适配某旧系统要求字段非空即有效值。动手前得确认上下游是否真接受 null 语义——否则修了一个 bug,埋了三个坑。











