最安全的方式是先用objects.nonnull()检查null,再用string.isempty()或isblank()判断内容——前者仅看长度,后者会trim后判断,jdk 11+推荐isblank(),jdk 8可用stringutils.isblank()替代。

Java 中判断字符串是否为空,最安全的方式是先用 Objects.nonNull() 检查 null,再用 String.isEmpty() 判断空内容——直接调用 str.isEmpty() 或 str.length() == 0 在 str 为 null 时会抛 NullPointerException。
为什么 str == null || str.length() == 0 是常见但不推荐的写法
它能工作,但可读性差、易漏括号、且没利用 JDK 自带的语义化工具。更关键的是:一旦后续逻辑扩展(比如要跳过空白字符),这种写法就得重写。JDK 7+ 的 Objects.nonNull() 和 JDK 11+ 的 String.isBlank() 才是更贴近意图的表达。
-
str == null || str.length() == 0不处理空白字符(如"\t\n "),实际业务中常需区分“空”和“仅空白” - 手写 null 判断容易漏,尤其在嵌套调用或链式表达式里(比如
getUser().getName().isEmpty()) - IDE 通常会对
str.isEmpty()在可能为 null 的变量上标黄警告,但不会拦住你运行
String.isEmpty() vs String.isBlank():选哪个取决于“空”的定义
二者都要求对象非 null;区别在于对空白字符的容忍度:
-
isEmpty()只看长度:长度为 0 才返回 true," "、"\n"都返回 false -
isBlank()(JDK 11+)会 trim 后判断:所有字符都是 Unicode 空白(含全角空格、换行、制表等)则返回 true - 如果项目还在用 JDK 8,别硬升
isBlank(),可用StringUtils.isBlank()(Apache Commons Lang)替代
示例:"".isEmpty() → true"\t\n ".isEmpty() → false"\t\n ".isBlank() → true(JDK 11+)
工具类怎么选:JDK 原生 vs Apache Commons Lang
如果你已经引入了 commons-lang3,StringUtils 是更省心的选择;否则优先用 JDK 原生,避免无谓依赖。
立即学习“Java免费学习笔记(深入)”;
-
StringUtils.isEmpty(str):null 安全,等价于str == null || str.length() == 0 -
StringUtils.isBlank(str):null 安全,等价于str == null || str.trim().isEmpty()(比 JDK 11isBlank()略宽松,不识别部分 Unicode 空白) - 注意:不要混用,比如
StringUtils.isEmpty(null)返回 true,但Objects.requireNonNull(str).isEmpty()会直接炸
最容易被忽略的坑:字符串来自外部输入时,null 和空白常混在一起
HTTP 参数、JSON 字段、数据库查询结果,都可能返回 null 或纯空白字符串。只判 isEmpty() 会漏掉 null;只判 == null 会漏掉 "\u3000"(中文全角空格)这类不可见字符。
- 真实场景建议统一用
StringUtils.trimToNull(str) != null或 JDK 11+ 的str != null && !str.isBlank() - 日志里打印疑似空字符串时,加个
str == null ? "null" : ("'" + str + "' length=" + str.length()),一眼看出是 null 还是隐形空白 - 单元测试务必覆盖 null、
""、" "、"\u3000"、"\t\n"这五种情况
真正麻烦的不是写对一行判断,而是整个代码路径里没人记得某个 getter 可能返回 null,或者某次 JSON 反序列化把缺失字段设成了空字符串而不是 null。










