今天在牛客网上做一个编程题时,在提交代码后老是抛出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。
2)在返回值为数组或者集合时,尽量返回长度为零的数组或者集合,而不是null,这样在调用时就能简化代码,减少不必要的麻烦,并且不必担心NullPointer异常(除非这对性能会造成很大的影响)。
就对自己以后编程来说,编写方法时,如果返回值是数组或者集合,就尽量返回长度为零的数组或者集合,而不是null。而自己调用方法时,还是要注意对null情况的判断。
此外,如果返回值为空对象时没有意义的话,就可以考虑直接抛出异常。
推荐阅读:
【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)
《Effective Java (Third Edition)》Item 54: Return empty collections or arrays, not nulls