杰瑞科技汇

Java字符串为空判断有哪些方法?

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

Java字符串为空判断有哪些方法?-图1
(图片来源网络,侵删)

下面我将从 最推荐的方法传统方法,再到 特殊情况,为你详细讲解如何正确地判断 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() 检查用 (逻辑或) 组合起来。

Java字符串为空判断有哪些方法?-图2
(图片来源网络,侵删)
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 == nulltruestr.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()strnull 时会立即抛出异常。


总结与建议

场景 推荐方法 (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() 更高效。
判断 nullnull/空字符串/空白字符串 Objects.requireNonNullElse(str, "").isEmpty() str == null || str.isBlank() Java 8+ 的 Objects 工具类提供了优雅的写法。

最终建议:

  1. 默认选择if (str == null || str.isEmpty()),这是处理“空”字符串最安全、最清晰的方式,适用于所有 Java 8+ 项目。
  2. 处理空白: 需要被视为空,使用 if (str == null || str.isBlank()) (Java 11+) 或 if (str == null || str.trim().isEmpty()) (Java 8+)。
  3. 封装工具方法:将常用的判断逻辑封装成一个静态工具方法,提高代码复用性和可读性。
// 工具类示例
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();
    }
}
分享:
扫描分享到社交APP
上一篇
下一篇