核心概念:区分 null 和 空字符串
在开始之前,必须明确两个概念:

null: 表示这个String变量没有引用任何对象,它不是一个有效的字符串。- 空字符串 : 表示这是一个有效的
String对象,但它内部不包含任何字符(长度为 0)。
一个常见的错误是直接对一个可能为 null 的字符串调用方法,str.length() 或 str.equals(""),这会抛出 NullPointerException。
使用 StringUtils (Apache Commons Lang / Spring) - 推荐
这是最常用、最简洁、最安全的方法,它已经为你处理了所有边界情况(null、、空白字符串等)。
你需要先添加依赖:
Maven:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version> <!-- 使用最新版本 -->
</dependency>
Gradle:
implementation 'org.apache.commons:commons-lang3:3.12.0' // 使用最新版本
1. 判断 null 或 (最常用)
使用 StringUtils.isEmpty()。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsExample {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = "Hello";
// 判断是否为 null 或 空字符串 ""
System.out.println("str1 is empty: " + StringUtils.isEmpty(str1)); // true
System.out.println("str2 is empty: " + StringUtils.isEmpty(str2)); // true
System.out.println("str3 is empty: " + StringUtils.isEmpty(str3)); // false (因为 str3 是 " ", 不为空)
System.out.println("str4 is empty: " + StringUtils.isEmpty(str4)); // false
}
}
2. 判断 null、 或 (包含空白字符)
使用 StringUtils.isBlank(),这在表单验证等场景中非常有用,可以判断用户是否只输入了空格或制表符。
import org.apache.commons.lang3.StringUtils;
public class StringUtilsExample {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = " Hello ";
String str5 = "Hello";
// 判断是否为 null, "" 或 " "
System.out.println("str1 is blank: " + StringUtils.isBlank(str1)); // true
System.out.println("str2 is blank: " + StringUtils.isBlank(str2)); // true
System.out.println("str3 is blank: " + StringUtils.isBlank(str3)); // true
System.out.println("str4 is blank: " + StringUtils.isBlank(str4)); // false (因为 str4 包含非空白字符)
System.out.println("str5 is blank: " + StringUtils.isBlank(str5)); // false
}
}
优点:
(图片来源网络,侵删)
- 简洁: 一行代码搞定,可读性高。
- 安全: 内部已经处理了
null检查,不会抛出NullPointerException。- 功能强大:
isBlank()方法特别实用。缺点:
- 需要引入第三方库。
使用 Java 8+ 的 Optional - 现代、函数式风格
如果你使用的是 Java 8 或更高版本,Optional 是一个很好的选择,它能更优雅地处理可能为 null 的值。
1. 判断 null 或
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = "Hello";
// Optional.ofNullable() 可以安全地包装可能为 null 的对象
// str 为 null, Optional 会是 Optional.empty()
// filter() 会保留满足条件的元素,否则返回 Optional.empty()
// isPresent() 检查是否有值
boolean isStr1Empty = Optional.ofNullable(str1).filter(String::isEmpty).isPresent();
boolean isStr2Empty = Optional.ofNullable(str2).filter(String::isEmpty).isPresent();
boolean isStr3Empty = Optional.ofNullable(str3).filter(String::isEmpty).isPresent();
System.out.println("str1 is empty: " + isStr1Empty); // true
System.out.println("str2 is empty: " + isStr2Empty); // true
System.out.println("str3 is empty: " + isStr3Empty); // false
}
}
优点:
- 函数式风格: 代码更声明式,易于组合。
- 显式: 明确表示该变量可能为空,增强了代码的可读性。
缺点:
- 略显复杂: 对于简单的
null/空判断,Optional的语法比StringUtils稍显冗长。- 开销: 创建
Optional对象有微小的性能开销(在绝大多数情况下可以忽略)。
手动实现 (不使用第三方库)
如果你不能或不想引入外部库,可以手动编写判断逻辑。
1. 判断 null 或
这是最基础、最核心的判断方式。
public class ManualCheckExample {
public static boolean isEmpty(String str) {
// 1. 先判断 str 是否为 null,防止 NPE
// 2. 再判断 str.length() 是否为 0
return str == null || str.length() == 0;
}
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = "Hello";
System.out.println("str1 is empty: " + isEmpty(str1)); // true
System.out.println("str2 is empty: " + isEmpty(str2)); // true
System.out.println("str3 is empty: " + isEmpty(str3)); // false
}
}
2. 判断 null、 或 (包含空白字符)
public class ManualCheckExample {
public static boolean isBlank(String str) {
if (str == null || str.length() == 0) {
return true;
}
// 遍历字符串,检查每个字符是否都是空白字符
for (int i = 0; i < str.length(); i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = " Hello ";
System.out.println("str1 is blank: " + isBlank(str1)); // true
System.out.println("str2 is blank: " + isBlank(str2)); // true
System.out.println("str3 is blank: " + isBlank(str3)); // true
System.out.println("str4 is blank: " + isBlank(str4)); // false
}
}
优点:
- 无依赖: 不需要任何外部库。
- 透明: 逻辑完全在自己的控制之下。
缺点:
- 代码冗长: 需要自己编写和维护代码,容易出错(比如忘记
null检查)。- 重复: 如果在多个地方使用,会造成代码重复。
Java 11+ 的 isBlank() 和 isEmpty() - 官方解决方案
从 Java 11 开始,String 类本身新增了两个非常实用的方法!这是最标准、最现代的方式。
1. isEmpty() - 判断 null 或
注意: String.isEmpty() 本身不能处理 null,所以必须先用 Objects.requireNonNull 或 Objects.isNull 等工具类,或者结合 Optional。
import java.util.Objects;
public class Java11Example {
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = "Hello";
// 必须先检查 null
boolean isStr1Empty = str1 == null || str1.isEmpty();
boolean isStr2Empty = str2 == null || str2.isEmpty();
boolean isStr3Empty = str3 == null || str3.isEmpty();
System.out.println("str1 is empty: " + isStr1Empty); // true
System.out.println("str2 is empty: " + isStr2Empty); // true
System.out.println("str3 is empty: " + isStr3Empty); // false
}
}
2. isBlank() - 判断 null、 或 (推荐!)
同样,String.isBlank() 也不能直接用于 null,最佳实践是将其封装在一个工具方法中。
import java.util.Objects;
public class Java11Example {
// 封装一个安全的方法来处理 null 和 isBlank
public static boolean isBlank(String str) {
return str == null || str.isBlank();
}
public static void main(String[] args) {
String str1 = null;
String str2 = "";
String str3 = " ";
String str4 = " Hello ";
System.out.println("str1 is blank: " + isBlank(str1)); // true
System.out.println("str2 is blank: " + isBlank(str2)); // true
System.out.println("str3 is blank: " + isBlank(str3)); // true
System.out.println("str4 is blank: " + isBlank(str4)); // false
}
}
优点:
- 官方标准: 无需引入任何外部库,是 Java 语言的一部分。
- 性能: 通常由 JVM 优化,性能很好。
- 可读性:
str.isBlank()非常直观。缺点:
- 版本限制: 需要 Java 11 或更高版本。
总结与最佳实践
| 场景 | 推荐方法 | 代码示例 |
|---|---|---|
| 项目允许使用第三方库 | StringUtils.isEmpty() / isBlank() |
StringUtils.isBlank(myString) |
| 项目不允许使用第三方库 & Java 11+ | String.isBlank() + 手动 null 检查 |
myString == null || myString.isBlank() |
| 项目不允许使用第三方库 & Java 8-10 | 手动实现 isEmpty() / isBlank() |
myString == null || myString.length() == 0 |
| 函数式编程风格 & Java 8+ | Optional.ofNullable().filter().isPresent() |
Optional.ofNullable(myString).filter(String::isEmpty).isPresent() |
我的建议:
- 首选
StringUtils.isBlank():在绝大多数项目中,引入commons-lang3是一个值得的投资,它的isBlank()方法是处理字符串空白的“黄金标准”,既安全又方便。 - 如果使用 Java 11+,拥抱标准库:将
myString == null || myString.isBlank()写成一个工具方法,然后在项目中复用,这是未来的趋势。 - 避免直接使用
str == "":这种方法虽然可行,但不够健壮,如果字符串是通过new String("")创建的, 会返回false,而str.length() == 0或str.isEmpty()是判断内容为空的最佳方式。 - 永远不要忘记
null检查:除非你 100% 确定字符串不会为null,否则在调用任何String方法之前,一定要先处理null的情况。

