Java應用中拋出空指針異常是解決空指針的最好方式,也是寫出能順利工做的健壯程序的關鍵。熟話說「預防勝於治療」,對於這麼使人討厭的空指針異常,這句話也是成立的。值得慶幸的是運用一些防護性的編碼技巧,跟蹤應用中多個部分之間的聯繫,你能夠將Java中的空指針異常控制在一個很好的水平上。順便說一句,這是Javarevisited上的第二個空指針異常的帖子。在上個帖子中咱們討論了Java中致使空指針異常的常見緣由,而在本教程中咱們將會學習一些Java的編程技巧和最佳實踐。這些技巧能夠幫助你避免Java中的空指針異常。聽從這些技巧一樣能夠減小Java代碼中處處都有的非空檢查的數量。做爲一個有經驗的Java程序員,你可能已經知道其中的一部分技巧而且應用在你的項目中。但對於新手和中級開發人員來講,這將是很值得學習的。順便說一句,若是你知道其它的避免空指針異常和減小空指針檢查的Java技巧,請和咱們分享。 html
這些都是簡單的技巧,很容易應用,可是對代碼質量和健壯性有顯著影響。根據個人經驗,只有第一個技巧能夠顯著改善代碼質量。如我以前所講,若是你知道任何避免空指針異常和減小空指針檢查的Java技巧,你能夠經過評論本文來和分享。 java
Object unknownObject = null; //錯誤方式 – 可能致使 NullPointerException if(unknownObject.equals("knownObject")){ System.err.println("This may result in NullPointerException if unknownObject is null"); } //正確方式 - 即使 unknownObject是null也能避免NullPointerException if("knownObject".equals(unknownObject)){ System.err.println("better coding avoided NullPointerException"); }這是避免空指針異常最簡單的Java技巧,但可以致使巨大的改進,由於equals()是一個常見方法。
BigDecimal bd = getPrice(); System.out.println(String.valueOf(bd)); //不會 NPE,但要注意和 String.valueOf(null) 的區別 System.out.println(bd.toString()); //拋出 "Exception in thread "main" java.lang.NullPointerException"
有不少開源庫已經爲您作了繁重的空指針檢查工做。其中最經常使用的一個的是Apache commons 中的StringUtils。你可使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其餘的工具方法而不用擔憂空指針異常。 程序員
//StringUtils方法是空指針安全的,他們不會拋出空指針異常 System.out.println(StringUtils.isEmpty(null)); System.out.println(StringUtils.isBlank(null)); System.out.println(StringUtils.isNumeric(null)); System.out.println(StringUtils.isAllUpperCase(null)); Output: true true false false可是在作出結論以前,不要忘記閱讀空指針方法的類的文檔。這是另外一個不須要下大功夫就能獲得很大改進的Java最佳實踐。
(PS:也能夠考慮 google 的 Guava 庫:com.google.common.base.Preconditions.checkNotNull
com.google.common.base.Optional)
數據庫
public List getOrders(Customer customer){ List result = Collections.EMPTY_LIST; return result; }你一樣可使用Collections.EMPTY_SET和Collections.EMPTY_MAP來代替空指針。
Person ram = new Person("ram"); int phone = ram.getPhone(); // if ram.getPhone() == null, here will thown NPE.當使用自動裝箱和自動拆箱的時候,不只僅是等號,< 或者 > 一樣會拋出空指針異常。你能夠經過這篇文章來學習更多的Java中的自動裝箱和拆箱的陷阱。
(PS:因此儘可能避免返回包裝類型,返回原始類型就能避免此類 NPE 問題了,或者返回類型與接收類型一致)
編程
還有一種方法來避免Java中的空指針異常。若是一個方法返回對象,在調用者中執行一些操做,例如Collection.iterator()方法返回迭代器,其調用者執行遍歷。假設若是一個調用者並無任何迭代器,其能夠返回空對象(Null object)而非null。空對象是一個特殊的對象,其在不一樣的上下文中有不一樣的意義。例如一個空的迭代器調用hasNext()返回false時,能夠是一個空對象。一樣的在返回Container和Collection類型方法的例子中,空對象能夠被用來代替null做爲返回值。我打算另寫一篇文章來說空對象模式,分享幾個Java空對象的例子。 數組
以上就是所有內容了,這是幾個易於聽從的避免空指針異常的Java技巧和最佳實踐。你應該能體會到這些技巧將很是有用,且不太難實現。若是你有其餘處理/預防空指針異常的技巧,而又沒包含在這裏,請經過評論來和咱們分享,我將收錄在這裏。