Java基础(四):数组/集合为null 和长度为0

x33g5p2x  于2021-09-20 转载在 Java  
字(1.4k)|赞(0)|评价(0)|浏览(521)

1、数组为空和长度为0的区别

1.1、对于方法返回数组或集合的判断

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

需要先判断是否为空,否则可能会出现空指针异常。
例如:

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

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

1.2、对于空数组和null

//只声明了一数组变量;        
int[] array1;                            

//声明一数组变量并赋值null,array1是一个数组类型的空引用,不指向任何对象;                  
int[] array1 = null;           

//声明并创建一数组对象,长度是0;一个长度为 0 的数组 / 空数组
int[] array2 = new int[0];  

//数组里可能只有一个空字符串 "",这时数组长度是 1。这种情况也要注意判断。
if ( arr.length == 1 && arr[ 0 ].equals( "" ) ) {
    System.out.println( "输入的数组不能只包含一个空字符串" );
    return;
}
  • 语句一变量还没初始化,打印 array会出错:“可能尚未初始化变量 n”;
  • 语句二虽已初始化,打印“array1.length”会出现异常:NullPointerException;
  • 语句三打印“array2.length”是0,数组内还没有元素。

       假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对放回数组进一步处理,而如果返回空数组即长度为0的数组(new int[0]),则无须null引用检查**。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样做对于函数调用者的处理比较方便。**

1.3、返回值到底应该是用null还是空集合?

1、牛客网上

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

public ArrayList<Integer> foo(TreeNode root) {

    if (root == null){

        return null;
    }

        ……

   return ...
}

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

public ArrayList<Integer> foo(TreeNode root) {

    if (root == null){

        return new ArrayList<Integer>();
    }

        ……

   return ...
}

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

2、《阿里巴巴JAVA开发手册》书中表示

可以返回null,因为防止NPE是调用者的责任。

3、《Effective Java (Third Edition)》书中表示

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

 总结:

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

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

相关文章