java中数组为空和数组长度为0的区别(注意是坑) CollectionUtils工具类

CollectionUtils

在  import org.apache.commons.collections.CollectionUtils包下面的方法

可以直接判断数组为空 || size> 0

两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。
eg:

if(array == null || 0 == array.length) {...}   // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。

if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。
例:

int[] n;        //只声明了一数组变量;                              
int[] nil = null;        //声明一数组变量,并赋值 null,nil是一个数组类型的空引用,不指向任何对象;                             
int[] zero = new int[0];  //声明并创建一数组对象,长度是0;

对于上面三条语句,一个比一个做的动作多,系统占用也是后面的多:
语句一变量还没初始化,打印 n 会出错:“可能尚未初始化变量 n”;
语句二虽已初始化,打印“nil.length”会出现异常:NullPointerException;

语句三打印“nil.length”是0,数组内还没有元素。
       假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对放回数组进一步处理,而如果返回空数组,则无须null引用检查。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样做对于函数调用者的处理比较方便。


Java中数组为空和数组长度为0的区别

今天在做题的时候遇到了这个问题,首先

List<List<Integer>> results = new ArrayList<>();
         if (nums == null) {
             return results; 
         }
         
         if (nums.length == 0) {
            results.add(new ArrayList<Integer>());
            return results;
         }

nums是一个数组,可以看到他们的区别。

int[] array = null; 数组为空,此时array不指向任何对象;

int[] array = new array[0]; 定义一个长度为0的数组;

int[] array = new array[2]; 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null;

一般先判断 nums 是否为空,然后再判断长度是否为0,因为可能报空指针异常。

所以如果在一行代码中要同时判断的时候需要这样写:

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

因为 || 是短路或,前面的符合了后面的就不考虑了。


【Java】返回长度为零的数组或者集合,而不是null


 今天在牛客网上做一个编程题时,在提交代码后老是抛出NullPointerException异常,大概的代码如下:

public ArrayList<Integer> foo(TreeNode root) {
    if (root == null)
        return null;
        ……
        ……
}

 后来改成如下代码就通过了。

public ArrayList<Integer> foo(TreeNode root) {
    if (root == null)
        return new ArrayList<Integer>();
        ……
        ……
}

 具体原因应该是牛客网中的测试代码没有考虑null的情况,希望我们返回的是一个空的ArrayList。

  就返回值到底应该是用null还是空集合的问题,查了一些资料:

《阿里巴巴JAVA开发手册》书中表示:可以返回null,因为防止NPE是调用者的责任。

Java 判断 数组 类型 java判断数组是否为null_数组

《Effective Java (Third Edition)》书中表示:返回长度为零的数组或者集合,而不是null。

Java 判断 数组 类型 java判断数组是否为null_初始化_02

再结合一下别的博客,自己大概总结一下:

  1)返回值为null并不会有什么问题,但是在“解引用”(dereference)时,调用者没有对null进行判断就会出现NullPointerException。

在返回值为数组或者集合时,尽量返回长度为零的数组或者集合,而不是null,这样在调用时就能简化代码,减少不必要的麻烦,并且不必担心NullPointer异常(除非这对性能会造成很大的影响)。

  就对自己以后编程来说,编写方法时,如果返回值是数组或者集合,就尽量返回长度为零的数组或者集合,而不是null。而自己调用方法时,还是要注意对null情况的判断。

  此外,如果返回值为空对象时没有意义的话,就可以考虑直接抛出异常。