qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          避免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最佳實踐。

          posted on 2014-10-30 11:56 順其自然EVO 閱讀(172) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 江华| 图片| 大安市| 九龙坡区| 高唐县| 白玉县| 全椒县| 随州市| 鄯善县| 民勤县| 辽宁省| 广汉市| 通海县| 林西县| 潞城市| 东源县| 大方县| 伊金霍洛旗| 丹江口市| 永泰县| 巴彦县| 广宗县| 冕宁县| 牟定县| 西昌市| 随州市| 英超| 岑溪市| 肥东县| 罗甸县| 安徽省| 达州市| 舒城县| 丹巴县| 昭苏县| 门源| 山东省| 武隆县| 盐山县| 长葛市| 读书|