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

null: 这表示变量没有引用任何对象,它不是一个有效的String对象,如果你尝试对null调用任何方法(如.length()或.equals()),都会抛出NullPointerException(空指针异常)。- (空字符串): 这是一个有效的
String对象,但它不包含任何字符,它的长度是0,你可以安全地对它调用任何String类的方法。
示例代码:
String str1 = null; // str1 是一个 null 引用
String str2 = ""; // str2 是一个空字符串对象
String str3 = "hello"; // str3 是一个正常的字符串对象
// 下面这些操作会抛出 NullPointerException
// System.out.println(str1.length());
// System.out.println(str1.equals(""));
// 下面这些操作是安全的
System.out.println(str2.length()); // 输出 0
System.out.println(str2.isEmpty()); // 输出 true
判断方法
根据你的具体需求(是否需要同时判断 null 和空字符串),有以下几种主流的判断方法。
基础 if 判断 (最直接)
这是最基础、最直观的方法,适合初学者理解。
场景1:只判断是否为 null

String str = null;
if (str == null) {
System.out.println("字符串是 null");
} else {
System.out.println("字符串不是 null");
}
场景2:判断是否为 null 或空字符串
String str = "";
if (str == null || str.equals("")) {
System.out.println("字符串是 null 或空字符串");
} else {
System.out.println("字符串有内容");
}
注意:这里必须把 str == null 放在前面,因为如果 str 是 null,后面的 str.equals("") 就不会执行,从而避免了 NullPointerException。
使用 String.isEmpty() (推荐)
String.isEmpty() 是 Java 6 引入的一个方法,它比 str.equals("") 更清晰、更高效(它内部直接检查 value.length == 0),它只检查字符串是否为空,不会检查 null。
场景:判断是否为 null 或空字符串

这是最常用和推荐的做法之一,因为它意图非常明确。
String str = null;
if (str == null || str.isEmpty()) {
System.out.println("字符串是 null 或空字符串");
} else {
System.out.println("字符串有内容");
}
优点:
- 可读性强:
isEmpty()这个方法名清楚地表达了意图。 - 性能稍好:
isEmpty()是一个本地方法(native method),通常比创建一个新字符串 再用equals()比较要快一点点。
使用 StringUtils (来自 Apache Commons Lang 或 Spring Framework)
在实际项目中,我们经常会使用第三方库提供的工具类,它们提供了更强大的功能。
Apache Commons Lang 的 StringUtils
你需要添加依赖:
<!-- Maven -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
StringUtils.isEmpty(String str)
这个方法同时判断 null 和空字符串 。
import org.apache.commons.lang3.StringUtils; String str1 = null; String str2 = ""; String str3 = "hello"; System.out.println(StringUtils.isEmpty(str1)); // true System.out.println(StringUtils.isEmpty(str2)); // true System.out.println(StringUtils.isEmpty(str3)); // false
StringUtils.isBlank(String str) (更强大)
这个方法不仅能判断 null 和 ,还能判断只包含空白字符(如空格 \s, 制表符 \t, 换行符 \n 等)的字符串,在很多业务场景下,这是最符合需求的判断。
import org.apache.commons.lang3.StringUtils; String str1 = null; String str2 = ""; String str3 = " "; String str4 = " hello "; String str5 = ""; System.out.println(StringUtils.isBlank(str1)); // true System.out.println(StringUtils.isBlank(str2)); // true System.out.println(StringUtils.isBlank(str3)); // true (只包含空格) System.out.println(StringUtils.isBlank(str4)); // false (包含非空白字符) System.out.println(StringUtils.isBlank(str5)); // true
Spring Framework 的 StringUtils
如果你已经在使用 Spring Framework,可以直接使用 org.springframework.util.StringUtils。
import org.springframework.util.StringUtils;
String str = " ";
// hasText() 同时检查 null, "" 和 " "
if (!StringUtils.hasText(str)) {
System.out.println("字符串为 null、空或仅包含空白字符");
}
注意:Spring 的 StringUtils.isEmpty(str) 只判断 null 和 ,而 StringUtils.hasText(str) 功能与 Apache 的 isBlank() 类似。
Java 8+ 的 Optional (函数式风格)
Java 8 引入了 Optional,它是一个容器对象,可能包含或不包含非 null 值,使用 Optional 可以优雅地处理 null 值,避免显式的 null 检查。
场景:安全地获取字符串长度
import java.util.Optional;
String str = null;
// 使用 Optional.ofNullable 包装可能为 null 的字符串
// str 为 null,则得到一个空的 Optional
// str 不为 null,则得到一个包含 str 的 Optional
Optional<String> optionalStr = Optional.ofNullable(str);
// 如果存在值,则执行操作
optionalStr.ifPresent(s -> {
System.out.println("字符串的长度是: " + s.length());
});
// 如果不存在值(即原字符串为 null),则执行 orElse 中的操作
String result = optionalStr.orElse("默认值");
System.out.println("处理后的结果是: " + result); // 输出: 处理后的结果是: 默认值
优点:
- 代码更健壮:强制开发者思考“当值为
null时该怎么办”。 - 链式调用:可以和 Stream API 结合,写出更函数式的代码。
缺点:
- 对于简单的
null判断,可能会显得有些“重”,不如直接if判断简洁。
总结与最佳实践
| 方法 | 判断 null |
判断 | 判断 | 推荐场景 |
|---|---|---|---|---|
str == null |
是 | 否 | 否 | 只需要判断 null 的情况。 |
str.isEmpty() |
否 | 是 | 否 | 需要判断 null 和 时的首选,可读性高。 |
StringUtils.isEmpty() |
是 | 是 | 否 | 已引入 Apache Commons Lang 时的标准做法。 |
StringUtils.isBlank() |
是 | 是 | 是 | 业务判断的首选,当用户输入可能为空格、Tab时,这个方法最可靠。 |
Optional.ofNullable() |
是 | 是 | 是 | Java 8+ 函数式编程风格,用于优雅地处理 null 和提供默认值。 |
最终建议:
- 如果你只需要判断
null:直接使用if (str == null)。 - 如果你需要判断
null或空字符串 :强烈推荐使用if (str == null || str.isEmpty()),这是最清晰、最标准、不依赖任何库的写法。 - 如果你的项目已经引入了 Apache Commons Lang 或 Spring:并且你的业务逻辑需要将 视为无效输入,请毫不犹豫地使用
StringUtils.isBlank(str),这是处理用户输入等场景的最佳实践。 - 如果你在编写函数式风格的代码:并且想避免
NullPointerException,可以探索使用Optional。
