两种“空”的情况
在开始之前,必须明确区分两种情况:

null(空值):这个String对象根本不存在,没有指向任何内存地址,试图对null调用任何方法都会抛出NullPointerException(空指针异常)。- (空字符串):这个
String对象是存在的,但它不包含任何字符,其长度为 0。
一个健壮的判断方法需要同时处理这两种情况。
最经典、最通用的方法 (推荐)
这是最常用、最安全、最推荐的方法,适用于所有 Java 版本。
String str = "some text"; // 或者 str = ""; 或者 str = null;
if (str == null || str.isEmpty()) {
System.out.println("字符串为 null 或空");
} else {
System.out.println("字符串不为空且不为 null");
}
代码解析:
str == null:首先检查str是否为null,如果是,整个if条件成立,后面的str.isEmpty()不会被短路执行,从而避免了NullPointerException。- 逻辑“或”运算符。
str == null为true,整个表达式直接为true。 str.isEmpty():str不是null,再调用String类的isEmpty()方法检查它是否是空字符串(长度为0)。
优点:

- 安全:完美处理了
null和空字符串两种情况。 - 高效:利用了逻辑或的“短路”特性,性能很好。
- 可读性高:代码意图非常清晰。
Java 8+ 的 Optional (函数式风格)
如果你使用的是 Java 8 或更高版本,并且喜欢函数式编程风格,可以使用 Optional 来优雅地处理。
Optional 是一个容器对象,它可以包含一个非 null 的值,也可以为空。
import java.util.Optional;
String str = "some text"; // 或者 str = ""; 或者 str = null;
// ofNullable() 会创建一个 Optional:str 为 null,则创建一个空的 Optional;否则创建一个包含 str 的 Optional。
Optional<String> optionalStr = Optional.ofNullable(str);
// optionalStr 中包含值且该值不为空字符串,则 isPresent() 为 true
if (optionalStr.isPresent() && !optionalStr.get().isEmpty()) {
System.out.println("字符串不为空且不为 null: " + optionalStr.get());
} else {
System.out.println("字符串为 null 或空");
}
更简洁的写法:
import java.util.Optional;
String str = "some text";
if (Optional.ofNullable(str).map(s -> !s.isEmpty()).orElse(false)) {
System.out.println("字符串不为空且不为 null");
} else {
System.out.println("字符串为 null 或空");
}
这段代码的意思是:Optional.ofNullable(str) 创建一个 Optional,然后用 map 对其中的值(如果存在)进行转换(s -> !s.isEmpty()),s 是 null,map 不会执行。orElse(false) 表示如果 Optional 是空的,则返回 false。

优点:
- 显式性:明确表达了“这个值可能为空”的意图。
- 函数式:符合 Java 8+ 的函数式编程范式,可以链式调用。
- 避免
NullPointerException:Optional的设计初衷就是为了优雅地处理null。
缺点:
- 对于这个简单的判断,代码比
if (str == null || str.isEmpty())稍显冗长。 - 如果项目不广泛使用
Optional,可能会增加团队的理解成本。
Apache Commons Lang 工具类
在大型项目中,我们通常会使用 Apache Commons Lang 或 Guava 这样的第三方库,它们提供了很多实用的工具方法。
你需要添加依赖 (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 = "some text"; // 或者 str = ""; 或者 str = null;
if (StringUtils.isEmpty(str)) {
System.out.println("字符串为 null 或空");
} else {
System.out.println("字符串不为空且不为 null");
}
StringUtils 还提供了其他有用的方法:
StringUtils.isBlank(str):不仅判断null和 ,还会判断只包含空白字符(如 ,"\t","\n")的字符串,这在很多场景下非常有用。StringUtils.isNotBlank(str):isBlank的反义。
优点:
- 代码简洁:一行代码搞定,可读性极佳。
- 功能强大:提供了
isBlank等更贴近业务需求的判断方法。 - 经过充分测试:作为成熟库,其稳定性和可靠性很高。
缺点:
- 引入外部依赖:需要为项目添加新的库。
Guava 工具类
与 Apache Commons Lang 类似,Google Guava 也提供了非常优秀的工具类。
添加依赖 (Maven):
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version> <!-- 使用最新版本 -->
</dependency>
使用 Strings 类:
import com.google.common.base.Strings;
String str = "some text"; // 或者 str = ""; 或者 str = null;
if (Strings.isNullOrEmpty(str)) {
System.out.println("字符串为 null 或空");
} else {
System.out.println("字符串不为空且不为 null");
}
Guava 的 Strings.isNullOrEmpty() 方法与 Apache 的 StringUtils.isEmpty() 功能完全一样。
优点/缺点:与 Apache Commons Lang 类似,代码简洁,功能强大,但需要引入外部依赖。
总结与推荐
| 方法 | 代码示例 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
经典 if 判断 |
if (str == null || str.isEmpty()) |
最通用、最安全、性能最好、无需依赖 | 代码稍长,但意图清晰 | 所有场景,尤其是没有外部依赖的简单项目或面试 |
Java 8+ Optional |
Optional.ofNullable(str).isPresent() && !str.isEmpty() |
函数式风格,显式处理 null |
对此简单场景略显冗长,团队需熟悉 | 项目已广泛使用 Optional 和函数式编程 |
| Apache Commons Lang | StringUtils.isEmpty(str) |
代码最简洁、功能丰富 | 需要引入 commons-lang3 依赖 |
大型项目或允许使用第三方库的项目 |
| Google Guava | Strings.isNullOrEmpty(str) |
代码最简洁、功能丰富 | 需要引入 guava 依赖 |
大型项目,特别是已经使用 Guava 其他功能的项目 |
最终建议:
- 对于日常开发和学习:强烈推荐使用
if (str == null || str.isEmpty()),这是最基础、最核心、最不会出错的方法。 - 对于企业级或大型项目:推荐引入 Apache Commons Lang 或 Guava,使用
StringUtils.isEmpty()或Strings.isNullOrEmpty(),能让代码更简洁、更专业。 - 如果你是 Java 8+ 的忠实拥护者:可以使用
Optional来体现函数式编程的思想,但在处理简单判断时,其优势不明显。
