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是调用者的责任。
《Effective Java (Third Edition)》书中表示:返回长度为零的数组或者集合,而不是null。
再结合一下别的博客,自己大概总结一下:
1)返回值为null并不会有什么问题,但是在“解引用”(dereference)时,调用者没有对null进行判断就会出现NullPointerException。
在返回值为数组或者集合时,尽量返回长度为零的数组或者集合,而不是null,这样在调用时就能简化代码,减少不必要的麻烦,并且不必担心NullPointer异常(除非这对性能会造成很大的影响)。
就对自己以后编程来说,编写方法时,如果返回值是数组或者集合,就尽量返回长度为零的数组或者集合,而不是null。而自己调用方法时,还是要注意对null情况的判断。
此外,如果返回值为空对象时没有意义的话,就可以考虑直接抛出异常。