【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。

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

 

 

 

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

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

 

推荐阅读:

在Java中,return null 是否安全, 为什么?

【java】方法应该返回空对象还是null

Avoiding != null statements

【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)

《Effective Java (Third Edition)》Item 54: Return empty collections or arrays, not nulls

 

posted @ 2018-10-18 19:22  华仔要长胖  阅读(6347)  评论(0编辑  收藏  举报