杰瑞科技汇

Java如何判断String是否为null?

null vs. (空字符串)

在开始之前,必须明确区分两个概念:

Java如何判断String是否为null?-图1
(图片来源网络,侵删)
  1. null:表示这个引用变量没有指向任何对象,它不是一个有效的 String 对象。
  2. (空字符串):表示这是一个有效的 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() 方法判断它是否是空字符串。注意:strnull,直接调用 str.isEmpty() 会抛出 NullPointerException,所以顺序很重要,必须先判断 null

使用 StringUtils (来自 Apache Commons Lang 或 Spring Framework)

在实际项目中,我们通常使用成熟的工具类库来处理这类通用任务,它们更简洁、更安全。

Java如何判断String是否为null?-图2
(图片来源网络,侵删)

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)strnull 或 ,返回 true
  • StringUtils.isBlank(String str)strnull、 或只包含空白字符,返回 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 LangSpring FrameworkStringUtils 功能强大(如 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()) 完全没问题。
分享:
扫描分享到社交APP
上一篇
下一篇