1. 概述

在 Java 中操作数组是常见任务,其中经常需要检查数组是否为 null 或空。这对防止 NullPointerException 确保代码正确处理数组结构至关重要。

本文将探讨有效执行这些检查的方法,适用于对象数组和基本类型数组。

2. 准备示例

先创建几个示例数组,用于演示如何检查数组是否为空或 null

final static String[] STR_ARRAY = new String[] { "a", "b", "c", "d" };
final static BigDecimal[] EMPTY_ARRAY = new BigDecimal[] {};
final static String[] NULL_ARRAY = null;

代码中创建了三种数组:

  • 包含四个元素的常规 String 数组
  • 空的 BigDecimal 数组
  • 引用为 nullString 数组

接下来我们将用这些数组演示不同的检查方法。

3. 创建检查方法

在 Java 中检查数组是否为 null 或空可通过两个简单操作实现:

  • null 检查:使用 == null
  • 空检查:检查数组的 length 属性是否为零

我们首先创建一个泛型检查方法

static <T> boolean isArrayNullOrEmpty(T[] theArray) {
    return theArray == null || theArray.length == 0;
}

该方法同时执行 null 和空检查。测试示例数组:

assertTrue(isArrayNullOrEmpty(NULL_ARRAY));
assertTrue(isArrayNullOrEmpty(EMPTY_ARRAY));
assertFalse(isArrayNullOrEmpty(STR_ARRAY));

⚠️ 但此方法存在局限:不适用于基本类型数组(如 int[], double[])。下一节将解决此问题。

4. 处理基本类型数组

int[] 数组为例:

final static int[] INT_ARRAY = new int[] { 1, 2, 3, 4 };

该数组既非 null 也非空。尝试用泛型方法检查:

assertFalse(isArrayNullOrEmpty(INT_ARRAY));

编译时直接报错:

java: method isArrayNullOrEmpty in class ... cannot be applied to given types;
  required: T[]
  found:    int[]
  reason: inference variable T has incompatible bounds 

原因:Java 泛型通过“类型擦除”实现,运行时所有泛型类型转换为 Object。而基本类型不继承自 Object,因此泛型不支持基本类型。

解决方案通过方法重载支持所有基本类型数组:

static boolean isArrayNullOrEmpty(int[] theArray) {
    return theArray == null || theArray.length == 0;
}
static boolean isArrayNullOrEmpty(short[] theArray) { /* 相同实现 */ }
static boolean isArrayNullOrEmpty(long[] theArray) { /* 相同实现 */ }
// float, double, byte, boolean 等基本类型同理

现在检查基本类型数组:

assertFalse(isArrayNullOrEmpty(INT_ARRAY));

✅ 代码编译通过且测试通过。

5. 使用 ArrayUtils.isEmpty() 方法

Apache Commons Lang 3 是广泛使用的工具库,其 ArrayUtils 类提供了丰富的数组操作方法,包括 isEmpty() 方法检查数组是否为 null 或空。

首先添加依赖到 pom.xml

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

使用 isEmpty() 方法:

assertTrue(ArrayUtils.isEmpty(NULL_ARRAY));
assertTrue(ArrayUtils.isEmpty(EMPTY_ARRAY));
assertFalse(ArrayUtils.isEmpty(STR_ARRAY));
// 基本类型数组
assertFalse(ArrayUtils.isEmpty(INT_ARRAY));

实现原理ArrayUtils 为每种数组类型提供了重载方法:

public static boolean isEmpty(final Object[] array)
public static boolean isEmpty(final short[] array)
public static boolean isEmpty(final int[] array)
public static boolean isEmpty(final long[] array)
// ... 其他基本类型

因此 ArrayUtils.isEmpty() 能正确处理所有数组类型。

6. 使用 ObjectUtils.isEmpty() 方法

Apache Commons Lang 3 的 ObjectUtils 类设计用于优雅处理 null 对象。当传入数组时,isEmpty() 也能检查是否为 null 或空

assertTrue(ObjectUtils.isEmpty(NULL_ARRAY));
assertTrue(ObjectUtils.isEmpty(EMPTY_ARRAY));
assertFalse(ObjectUtils.isEmpty(STR_ARRAY));
// 基本类型数组
assertFalse(ObjectUtils.isEmpty(INT_ARRAY));

核心实现

public static boolean isEmpty(final Object object) {
    if (object == null) {
        return true;
    }
  
    if (isArray(object)) {
        return Array.getLength(object) == 0;
    }
    // ... 无关代码省略
    return false;
}

public static boolean isArray(final Object object) {
    return object != null && object.getClass().isArray();
}

关键点primitiveArray.getClass().isArray() 返回 true,因此该方法同时支持对象数组和基本类型数组。

7. 总结

检查数组是否为 null 或空是 Java 编程的基础任务。本文探讨了:

  • 为对象数组和基本类型数组创建通用检查方法
  • 使用 Apache Commons Lang 3 的 ArrayUtils.isEmpty()ObjectUtils.isEmpty() 方法

这些实践能帮助编写更简洁、安全、可靠的 Java 代码。完整示例代码可在 GitHub 获取。


原始标题:Checking if an Array Is Null or Empty in Java | Baeldung