如何检查一个数组是否为null / 空?

175

我有一个没有任何元素的int数组,并且我想要检查它是否为空。

例如,为什么下面代码中if语句的条件永远不成立?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}

你能贴上更多的代码吗?看到数组初始化的那部分会很有帮助。 - Mark Pope
我不确定你在问什么。如果要检查一个数组是否为空,通常会写成(array == null)。 - Paul
7
你不想要这样做吗?(如果k不为null) - vickirk
14个回答

263

null数组和空数组之间存在重要的区别。这是一个针对null的测试。

int arr[] = null;
if (arr == null) {
  System.out.println("array is null");
}

在这里,“Empty”没有官方的定义。我选择将其定义为空,即具有0个元素:

arr = new int[0];
if (arr.length == 0) {
  System.out.println("array is empty");
}

“空”的另一种定义是如果所有元素都是null

Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
  if (arr[i] != null) {
    empty = false;
    break;
  }
}
或者
Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}

1
哎呀,最后一段代码片段中有 obj !- null,可能应该是 obj != null - user85421
8
不要忘记:org.apache.commons.lang3.ArrayUtils.isEmpty(k) - aholub7x
请记住,=== 不起作用。您必须使用 ==,因为 null 是不同类型的。 - Elijah Mock
为什么有人会将 null 赋值给 int 数组,如果它默认已经被初始化为零了呢?只有引用类型才会被初始化为 null。 - JacobTheKnitter

144

ArrayUtils.isNotEmpty(testArrayName) 来自于 org.apache.commons.lang3 包,确保数组不为 null 或空


30

可以在org.apache.commons.lang中找到检查数组是否为空或null的方法:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

24

看一下它的长度:

int[] i = ...;
if (i.length == 0) { } // no elements in the array

尽管同时检查 null 更加安全:

if (i == null || i.length == 0) { }

2
如果您需要检查 null 和长度为 0,重要的是首先检查 null,就像您所做的那样,以避免可能的空指针错误。 - Bill Milagro

4
我来自.net背景。然而,Java和C#差不多。
如果你实例化一个非原始类型(例如数组),它不会是null。 例如:int[] numbers = new int[3]; 在这种情况下,空间被分配,并且每个元素都有默认值0。
如果你没有使用new来初始化它,它将会是null。例如:
int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}

1
在Java中,这段代码无法编译,因为它会告诉你numbers尚未初始化。"未初始化"和null并不相同。 - Joachim Sauer
谢谢Joachim。我将编辑帖子,将int[] numbers更改为int[] numbers == null;在C#中,情况并非如此。 - shahkalpesh

4
在Java 8及以上版本中,您可以借助流的allMatch方法来实现此功能。
对于原始类型:
int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)

对于对象:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)

3

一个int数组被初始化为零,因此它实际上永远不会包含null。只有Object类型的数组在初始状态下才会包含null。


如果我必须检查整数的空值呢? - Ankit Sachan
1
你不能使用原始类型(如int)检查null。 - objects
2
取决于你在哪里声明它,如果是作为类成员,则会被初始化为零。但是当在方法内部局部声明时,我认为情况又不同了...你必须自己分配一个初始值。这只是我的想法! - ultrajohn

3
如果您想在Spring框架中检查,那么ObjectUtils类中的isEmpty(Object[])方法会有所帮助。
public static boolean isEmpty(@Nullable Object[] array) {
        return (array == null || array.length == 0);
    }

2
我进行了以下测试。希望对您有所帮助。
Integer[] integers1 = new Integer[10];
        System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
        for (Integer integer : integers1) {
            System.out.println(integer); //prints all 0s
        }

//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
//        integers1[2] = 0;
        for (Integer integer : integers1) {
            System.out.println(integer); //Still it prints all 0s but it is not empty
            //but that manually added 0 is different
        }

//Even we manually add 0, still we need to treat it as null. This is semantic logic.

        Integer[] integers2 = new Integer[20];
        integers2 = null; //array is nullified
//        integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line. 
        if (integers2 == null) {
            System.out.println("null Array");
        }   

2
这里的要点很简单,变量k不是null,因为它指向数组。即使数组本身是空的,这也无关紧要。在你的帖子中进行的null测试只有在变量k没有指向任何东西时才会评估为true。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接