为什么在证明数组为空时我们需要同时执行这两个操作?

时间:2017-02-03 22:40:37

标签: java arrays

例如,给定java中的数组:nums 当我们证明nums是否为空时,我们需要做 -

if(nums == null || nums.length == 0)

而不仅仅是

if(nums.length == 0)

为什么?

3 个答案:

答案 0 :(得分:2)

您需要确保首先未定义nums,否则尝试从未定义或空对象引用属性将导致NullPointerException

此外,每个代码片段完成两个完全不同的事情和你的情况,或者足以指示你不应该对数组“做某事”:

nums == null      // This checks if your array exists
nums.length == 0  // This checks if your array has no elements

答案 1 :(得分:0)

考虑这组方法:

public void breakEverything() {
    MyClass[] bob;
    // pass a null object to iterateArray
    iterateArray(bob);
}

public void dontBreakStuff() {
    MyClass[] bob = new MyClass[0];
    // pass an array of length 0 to iterateArray
    iterateArray(bob);
}

public void iterateArray(int[] arr) {
    for (int i == 0; i < arr.length; i++) {
        doSomethingWith(arr[i]);
    }
}

实际上有几件事情在这里发生:

对于breakEverything()方法 - 您将空引用传递给iterateArray()方法。这就是参数arr为null,因此调用任何方法或访问该参数上的任何变量都将引发NPE。您可以通过包含支票来防止这种情况:

if (arr == null) {
    return;
}

但是你的问题还存在第二个问题:

  

当我们证明nums是否为空时,我们需要做if(nums ==   null || nums.length == 0)而不仅仅是(nums.length == 0)

这里的问题是MyClass[].length()返回分配的数组的容量,它实际上没有返回你放在数组中的元素数量 - 就是它不计算非零指数的数量。您可能会想到ArrayList.size() - 它实际上计算了List中元素的数量,而不是分配的空间(这是因为ArrayList的大小可以增大和缩小,而原始数组则不能)。

答案 2 :(得分:0)

如果数组没有用数据初始化,即

int[] nums=null;
if(nums.length==0){}

为您提供 NullPointerException - 因为您尝试访问不存在的信息

如果您声明但未初始化数组nums

int[] nums ;
if(nums==null || nums.length==0){}

为您提供编译错误 - 因为您尚未初始化并尝试访问它

简而言之nums==null null check