null vs. (空字符串)
在开始之前,必须明确区分两个概念:

null:表示这个引用变量没有指向任何对象,它不是一个有效的String对象。- (空字符串):表示这是一个有效的
String对象,但是它里面没有任何字符,它的长度是 0。
一个健壮的判断通常需要同时检查这两种情况。
基础 if-else 判断 (最基础、最直观)
这是最原始的方法,通过 if 语句分别判断 null 和空字符串。
String str = "Hello World"; // 可以是 null, "", 或 "Hello World"
if (str == null) {
System.out.println("字符串是 null");
} else if (str.isEmpty()) {
System.out.println("字符串是空字符串 (\"\")");
} else {
System.out.println("字符串有内容: " + str);
}
代码解释:
str == null:首先检查引用变量str是否没有指向任何对象。str.isEmpty():str不是null,再调用String类的isEmpty()方法判断它是否是空字符串。注意:str是null,直接调用str.isEmpty()会抛出NullPointerException,所以顺序很重要,必须先判断null。
使用 StringUtils (来自 Apache Commons Lang 或 Spring Framework)
在实际项目中,我们通常使用成熟的工具类库来处理这类通用任务,它们更简洁、更安全。

Apache Commons Lang
这是最流行的工具库之一。
添加 Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>
然后使用 StringUtils:
import org.apache.commons.lang3.StringUtils;
String str = null;
// 检查是否为 null 或空字符串
if (StringUtils.isEmpty(str)) {
System.out.println("字符串是 null 或空字符串");
} else {
System.out.println("字符串有内容: " + str);
}
// 检查是否为 null、空字符串或只包含空白字符 (如 " ", "\t", "\n")
String strWithSpaces = " ";
if (StringUtils.isBlank(strWithSpaces)) {
System.out.println("字符串是 null、空或只包含空白字符");
}
常用方法:
StringUtils.isEmpty(String str):str为null或 ,返回true。StringUtils.isBlank(String str):str为null、 或只包含空白字符,返回true,这个方法在处理用户输入时非常有用。StringUtils.isNotEmpty(String str):与isEmpty相反。StringUtils.isNotBlank(String str):与isBlank相反。
Spring Framework
如果你的项目已经使用了 Spring,可以直接使用其提供的 StringUtils。
无需额外依赖,Spring Core 已包含。
import org.springframework.util.StringUtils;
String str = "";
// 检查是否为 null 或空字符串
if (StringUtils.isEmpty(str)) {
System.out.println("字符串是 null 或空字符串");
}
// 检查是否为 null 或空字符串,并可选地修剪空白字符
String strWithSpaces = " hello ";
// 会先调用 trim(),trim() 后为空,则返回 true
if (StringUtils.hasText(strWithSpaces)) {
System.out.println("字符串有实际内容(不包括前后空格): " + strWithSpaces.trim());
}
常用方法:
StringUtils.isEmpty(String str):与 Apache 的功能相同。StringUtils.hasText(String str):str不为null,且长度大于 0,并且至少有一个非空白字符,返回true,这个方法非常强大,是处理用户输入的首选。
Java 8+ 的 Optional (函数式风格)
Optional 是 Java 8 引入的一个容器对象,它可以包含或不包含非 null 值,它旨在减少 NullPointerException 的发生,并提供更优雅的 null 检查方式。
import java.util.Optional;
String str = null;
// 1. 创建一个 Optional 对象,str 为 null,则创建一个空的 Optional
Optional<String> optionalStr = Optional.ofNullable(str);
// 2. 使用 isPresent() 判断是否有值
if (optionalStr.isPresent()) {
// 只有在 isPresent() 为 true 时,才能安全地获取值
System.out.println("字符串有内容: " + optionalStr.get());
} else {
System.out.println("字符串是 null");
}
// 3. 使用 orElse() 提供默认值(更推荐的方式)
String result = Optional.ofNullable(str).orElse("默认值");
System.out.println("处理后的结果: " + result); // 输出: 处理后的结果: 默认值
// 4. 结合 filter() 和 isPresent() 进行复杂判断
Optional.ofNullable(str)
.filter(s -> !s.isEmpty()) // 过滤掉空字符串
.ifPresent(s -> System.out.println("字符串有内容且不为空: " + s));
// str 是 null 或 "",上面的代码块不会执行
Optional 的优点:
- 显式性:代码明确表达了“这个变量可能为空”的意图。
- 安全性:强制开发者处理
null的情况,而不是忘记处理。 - 链式调用:可以流畅地进行一系列操作。
Java 11+ 的 isBlank() 和 isEmpty() (原生支持)
从 Java 11 开始,String 类本身新增了非常方便的方法!
String.isBlank():检查字符串是否为空 () 或只包含空白字符,这完美替代了StringUtils.isBlank()。String.isEmpty():检查字符串是否为空 (),这与之前 Java 8 的功能相同,但为了完整性再次列出。
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = "Hello";
// --- 判断 null 或空字符串 ---
// 原生方法,需要先判断 null
if (str1 == null || str1.isEmpty()) {
System.out.println("str1 是 null 或空字符串");
}
// --- 判断 null、空或只含空白字符 ---
// 原生方法,需要先判断 null
if (str3 == null || str3.isBlank()) {
System.out.println("str3 是 null、空或只含空白字符");
}
// Java 11+ 的最佳实践
public boolean isNullOrEmpty(String str) {
return str == null || str.isEmpty();
}
public isNullOrBlank(String str) {
return str == null || str.isBlank();
}
总结与推荐
| 场景 | 推荐方法 | 优点 |
|---|---|---|
| 新手学习 / 简单脚本 | if (str == null || str.isEmpty()) |
直观,无需任何依赖。 |
| 企业级项目 / 已有依赖 | Apache Commons Lang 或 Spring Framework 的 StringUtils |
功能强大(如 isBlank),代码简洁,是业界标准。 |
| 函数式编程 / 链式调用 | Java 8+ 的 Optional |
优雅,显式处理 null,避免 NPE。 |
| Java 11+ 项目 | String.isBlank() |
原生支持,性能最好,无需外部库。 |
最终建议:
- 如果你的项目使用 Java 11 或更高版本,优先使用
String.isBlank()和String.isEmpty(),并自己封装一个工具方法,如isNullOrEmpty(String str)。 - 如果你的项目使用 Java 8 并且已经引入了 Spring,强烈推荐使用
org.springframework.util.StringUtils.hasText()。 - 如果你的项目使用 Java 8 但没有 Spring,Apache Commons Lang 是最佳选择。
- 对于简单的、一次性的代码,直接使用
if (str == null || str.isEmpty())完全没问题。
