避免Java應用中NullPointerException的技巧和最佳實踐
Java應用中拋出的空指針異常是解決空指針的最好方式,也是寫出能順利工作的健壯程序的關(guān)鍵。俗話說“預防勝于治療”,對于這么令人討厭的空指針異常,這句話也是成立的。值得慶幸的是運用一些防御性的編碼技巧,跟蹤應用中多個部分之間的聯(lián)系,你可以將Java中的空指針異常控制在一個很好的水平上。順便說一句,這是Javarevisited上的第二個空指針異常的帖子。在上個帖子中我們討論了Java中導致空指針異常的常見原因,而在本教程中我們將會學習一些Java的編程技巧和最佳實踐。這些技巧可以幫助你避免Java中的空指針異常。遵從這些技巧同樣可以減少Java代碼中到處都有的非空檢查的數(shù)量。作為一個有經(jīng)驗的Java程序員,你可能已經(jīng)知道其中的一部分技巧并且應用在你的項目中。但對于新手和中級開發(fā)人員來說,這將是很值得學習的。順便說一句,如果你知道其它的避免空指針異常和減少空指針檢查的Java技巧,請和我們分享。
這些都是簡單的技巧,很容易應用,但是對代碼質(zhì)量和健壯性有顯著影響。根據(jù)我的經(jīng)驗,只有第一個技巧可以顯著改善代碼質(zhì)量。如我之前所講,如果你知道任何避免空指針異常和減少空指針檢查的Java技巧,你可以通過評論本文來和分享。
1) 從已知的String對象中調(diào)用equals()和equalsIgnoreCase()方法,而非未知對象。
總是從已知的非空String對象中調(diào)用equals()方法。因為equals()方法是對稱的,調(diào)用a.equals(b)和調(diào)用b.equals(a)是完全相同的,這也是為什么程序員對于對象a和b這么不上心。如果調(diào)用者是空指針,這種調(diào)用可能導致一個空指針異常
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技巧,但能夠?qū)е戮薮蟮母倪M,因為equals()是一個常見方法。
2) 當valueOf()和toString()返回相同的結(jié)果時,寧愿使用前者。
因為調(diào)用null對象的toString()會拋出空指針異常,如果我們能夠使用valueOf()獲得相同的值,那寧愿使用valueOf(),傳遞一個null給valueOf()將會返回“null”,尤其是在那些包裝類,像Integer、Float、Double和BigDecimal。
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不會拋出空指針異常
System.out.println(bd.toString()); //拋出 "Exception in thread "main" java.lang.NullPointerException"
3) 使用null安全的方法和庫 有很多開源庫已經(jīng)為您做了繁重的空指針檢查工作。其中最常用的一個的是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 |
但是在做出結(jié)論之前,不要忘記閱讀空指針方法的類的文檔。這是另一個不需要下大功夫就能得到很大改進的Java最佳實踐。