今天在牛客網上做一個編程題時,在提交代碼后老是拋出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