在 Java 中,判断一个字符串是否为空(或为 null)是一个非常常见且重要的操作,直接使用 或 if (str) 来判断是不可靠的,会导致 NullPointerException。

下面我将从 最推荐的方法 到 传统方法,再到 特殊情况,为你详细讲解如何正确地判断 Java 字符串为空。
核心结论(TL;DR)
如果你使用的是 Java 8 或更高版本,这是最推荐、最安全、最简洁的方法:
String str = ...; // 你的字符串变量
if (str == null || str.isEmpty()) {
// 字符串为 null 或 长度为 0
System.out.println("字符串为空");
} else {
// 字符串不为 null 且长度大于 0
System.out.println("字符串不为空");
}
Java 8+ 推荐方法:String.isEmpty()
这是最现代、最清晰的方式,它将 null 检查和空字符串检查分开,逻辑非常明确。
String.isEmpty() 方法
- 作用:判断字符串的长度是否为 0。
- 返回值:
true:如果字符串长度为 0 ()。false:如果字符串长度大于 0 ("hello")。
- 重要:如果调用
isEmpty()的字符串对象是null,会抛出NullPointerException。你必须先检查null。
最佳实践:组合判断
将 null 检查和 isEmpty() 检查用 (逻辑或) 组合起来。

public boolean isNullOrEmpty(String str) {
// str 是 null,短路,直接返回 true
// str 不是 null,则继续执行 str.isEmpty()
return str == null || str.isEmpty();
}
// 使用示例
String s1 = null;
String s2 = "";
String s3 = " "; // 只有空格的字符串
String s4 = "hello";
System.out.println(isNullOrEmpty(s1)); // true
System.out.println(isNullOrEmpty(s2)); // true
System.out.println(isNullOrEmpty(s3)); // false (长度不为0)
System.out.println(isNullOrEmpty(s4)); // false
为什么这是最佳实践?
- 可读性强:
str == null || str.isEmpty()的意图一目了然。 - 性能高: 是短路操作符,
str == null为true,str.isEmpty()不会被调用,避免了潜在的 NPE。 - 安全:明确处理了
null的情况。
传统方法:String.length()
在 Java 8 之前,或者在某些需要兼容旧代码的场景下,使用 length() 是常见的做法。
String.length() 方法
- 作用:返回字符串的长度。
- 返回值:
0:如果字符串长度为 0 ()。- 大于 0 的整数:如果字符串长度不为 0。
- 重要:如果调用
length()的字符串对象是null,会抛出NullPointerException。
传统判断方式
String str = ...;
if (str == null || str.length() == 0) {
// 字符串为 null 或 长度为 0
System.out.println("字符串为空");
}
与 isEmpty() 的比较
- 功能上:
str.isEmpty()和str.length() == 0在非null字符串上的效果是完全一样的。 - 可读性:
isEmpty()的语义更清晰,直接表达了“为空”的意图,而length() == 0是一种实现细节。isEmpty()是更优的选择。
特殊情况:只包含空白字符的字符串
我们需要判断一个字符串是否“看起来像空的”,即它只包含空格、制表符、换行符等空白字符。。
对于这种情况,Java 提供了 String.isBlank() 方法(Java 11+ 引入)。
String.isBlank() 方法
- 作用:判断字符串是否为空或只包含空白字符。
- 返回值:
true:如果字符串为null、长度为 0,或者只包含空白字符。false:否则。
- 注意:它内部已经处理了
null检查,所以直接调用即可,但为了清晰,显式检查null仍然是好习惯。
示例
String s1 = null;
String s2 = "";
String s3 = " ";
String s4 = " hello ";
String s5 = "hello";
// Java 11+ 推荐方式
if (s1 == null || s1.isBlank()) {
System.out.println("s1 是空白或为空"); // true
}
if (s2.isBlank()) {
System.out.println("s2 是空白或为空"); // true
}
if (s3.isBlank()) {
System.out.println("s3 是空白或为空"); // true
}
if (s4.isBlank()) {
System.out.println("s4 是空白或为空"); // false
}
if (s5.isBlank()) {
System.out.println("s5 是空白或为空"); // false
}
如果你使用的是 Java 8,没有 isBlank() 方法,可以自己实现:
// Java 8 兼容的 isBlank 实现
public boolean isBlank(String str) {
return str == null || str.trim().isEmpty();
}
// 使用示例
String s3 = " ";
System.out.println(isBlank(s3)); // true
注意:trim() 方法会创建一个新的字符串,可能会有轻微的性能开销,但对于大多数应用来说可以忽略不计。
需要避免的错误方法
错误 1:直接使用 if (str)
String str = null;
// if (str) { ... } // 编译错误!Java 中 boolean 不能直接赋给 String
这会导致编译错误,因为 Java 不是像 JavaScript 或 Python 这样的动态语言。
错误 2:使用 if (str == "")
String str = null;
if (str == "") { // 永远不会进入这里,因为 null 和 "" 不是同一个对象
// ...
}
// 后续代码如果使用 str,还是会 NPE
这个判断无法处理 null 的情况,是无效的。
错误 3:先 isEmpty() 再 null 检查
String str = null;
if (str.isEmpty() || str == null) { // 第一行就会抛出 NullPointerException
// ...
}
逻辑顺序错误,isEmpty() 在 str 为 null 时会立即抛出异常。
总结与建议
| 场景 | 推荐方法 (Java 8+) | 推荐方法 (Java 11+) | 说明 |
|---|---|---|---|
判断 null 或长度为 0 |
str == null || str.isEmpty() |
str == null || str.isEmpty() |
最通用、最推荐的标准判断。 |
判断 null 或空白字符串 |
str == null || str.trim().isEmpty() |
str == null || str.isBlank() |
当 也被认为是“空”时使用。isBlank() 更高效。 |
判断 null 或 null/空字符串/空白字符串 |
Objects.requireNonNullElse(str, "").isEmpty() |
str == null || str.isBlank() |
Java 8+ 的 Objects 工具类提供了优雅的写法。 |
最终建议:
- 默认选择:
if (str == null || str.isEmpty()),这是处理“空”字符串最安全、最清晰的方式,适用于所有 Java 8+ 项目。 - 处理空白: 需要被视为空,使用
if (str == null || str.isBlank())(Java 11+) 或if (str == null || str.trim().isEmpty())(Java 8+)。 - 封装工具方法:将常用的判断逻辑封装成一个静态工具方法,提高代码复用性和可读性。
// 工具类示例
public final class StringUtils {
private StringUtils() {} // 防止实例化
/**
* 判断字符串是否为 null 或长度为 0。
*/
public static boolean isNullOrEmpty(String str) {
return str == null || str.isEmpty();
}
/**
* 判断字符串是否为 null、长度为 0 或只包含空白字符。
* (适用于 Java 8)
*/
public static boolean isBlank(String str) {
return str == null || str.trim().isEmpty();
}
} 