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 数组
- 引用为 null 的 String 数组
接下来我们将用这些数组演示不同的检查方法。
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 获取。