qiyadeng

          專注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34

          空指針異常(Null Pointer Exception)是我們平時最容易碰到的,也是最令人討厭的異常。本文介紹如何避免出現(xiàn)空指針異常。

          首先我們看如下的示例

          private Boolean isFinished(String status) {  
          if (status.equalsIgnoreCase("Finish")) {
          return Boolean.TRUE;
          } else {
          return Boolean.FALSE;
          }
          }


          如果status的值為空的話,那么將會出現(xiàn)空指針異常(本例第2行)。所以我們應(yīng)該使用如下的方法
          private Boolean isFinished(String status) {
          if ("Finish".equalsIgnoreCase(status)) {
          return Boolean.TRUE;
          } else {
          return Boolean.FALSE;
          }
          }

          這樣的話,如果status為空,也不會出現(xiàn)空指針異常。相信我們大多數(shù)朋友已經(jīng)知道這樣的方法了,如果一個對象可能為null,那么不需要直接調(diào)用它的方法。

          接下來我將接著提供幾種避免空指針的建議。

          1.判斷Collection是否為空。

          2.使用一些判斷方法。

          3.assert關(guān)鍵字。

          4.Assert類。

          5.異常處理。

          6.太多的點.操作語法。

          7.使用StringUtils類

          1.判斷Collection是否為空

          Collection 為空是指Collection中沒有元素。一些開發(fā)者如果碰到Collection中沒有元素的時候,經(jīng)常return null,更好的做法是,你應(yīng)該return Collections.EMPTY_LIST,Collections.EMPTY_SET或者是Collections.EMPTY_MAP.

          錯誤的代碼

          public static List getEmployees() {  
          List list = null;
          return list;
          }

          正確的代碼

          public static List getEmployees() {  
          List list = Collections.EMPTY_LIST;
          return list;
          }


          2.使用一些判斷方法

          使用一些方法如contains(),indexOf(),isEmpty(),containsKey(),ContainsValue和hasNext()等來判斷,確保不存在空值。

          示例:

          String myName = "qiyadeng";  

          List list = Collections.EMPTY_LIST;
          boolean exist = list.contains(myName);
          int index = list.indexOf(myName);
          boolean isEmpty =list.isEmpty();

          Map map =Collections.EMPTY_MAP;
          exist=map.containsKey(myName);
          exist=map.containsValue(myName);
          isEmpty=map.isEmpty();

          Set set=Collections.EMPTY_SET;
          exist=set.contains(myName);
          isEmpty=set.isEmpty();

          Iterator iterator;
          exist = iterator.hasNext();

          3.assert關(guān)鍵字

          在Java1.4版本之后,提供了斷言assert來確定你的代碼中的假設(shè)。使用的語法如下:

          assert expression1

          expression1是一個boolean表達(dá)式,如果expression1返回的false,系統(tǒng)將會拋出AssertError(沒有詳細(xì)信息)。

          另外一種使用方法

          assert expression1:expression2

          如果expression1返回false,那么系統(tǒng)將會拋出AssertError,并且詳細(xì)信息為expression2。

          示例:

          public static String getManager(String employeeId) {  
          assert (employeeId != null) : "employeeId must be not null";
          return "qiyadeng";
          }

          我使用getManager(null)來調(diào)用getManger方法,最后運行的結(jié)果是"java.lang.AssertionError:employeedId must be not null"
          注意記得使用java選項中加入-enableassertion開啟assertion功能。

          4.Assert類

          Assert類在com.bea.core.repackaged.springframework.util包中,有許多方法可以用于斷言。

          public static String getManager(String employeeId) {  
          Assert.notNull(employeeId, "employeeId must be not null");
          Assert.hasLength(employeeId, "employeeId must has length greater than 0");
          return "qiyadeng";
          }

          當(dāng)我同樣使用getManager(null)來調(diào)用getManager方法,將獲得信息"java.lang.IllegalArgumentException: employeeId must be not null"。

          5.異常處理

          使用try catch處理異?;蚴菣z查變量是否為空。

          public static String getManager(String employeeId) {  
          return null;
          }

          如上代碼,我使用下面方法調(diào)用
          String managerId = getManager("A015");  
          System.out.println(managerId.toString());

          將會發(fā)生"java.lang.NullPointerException",為了處理這個異常,我們應(yīng)該使用try catch來處理異?;蛘呤菣z查變量是否為null。

          try-catch方法

          String managerId = getManager("A015");  
          try {
          System.out.println(managerId.toString());
          } catch (NullPointerException npe) {
          //write your code here
          }

          或者是對變量進(jìn)行檢查
          String managerId = getManager("A015");  
          if (managerId != null) {
          System.out.println(managerId.toString());
          } else {
          //write your code here
          }

          6.不要太多的點.操作語法

          一些開發(fā)者使用太多的這樣的方法來減少代碼,但是這個對后面的維護和異常處理都是不太好的。

          錯誤的寫法

          String attrValue = (String)findViewObject("VO_NAME").getCurrentRow().getAttribute("Attribute_NAME");

          正確的寫法
          ViewObject vo = findViewObject("VO_NAME");  
          Row row = vo.getCurrentRow();
          String attrValue = (String)row.getAttribute("Attribute_NAME");

          7.使用StringUtils類

          StringUtil是org.apache.commns.lang包中的類,我們可以使用該類來避免空指針異常。

          例如 StringUtils.isEmpty(),StringUtils.isBlank,StringUtils.equals()等等,更多的你可以參考文檔。

          為了不出現(xiàn)空指針異常,在寫代碼的過程中需要時刻檢查你的代碼是否會拋出NullPointerException,如果你沒有時間及時調(diào)整的話,使用//TODO標(biāo)記,便于你后面解決問題。

          原創(chuàng)文章,轉(zhuǎn)載請注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

          本文鏈接地址: 在Java中避免空指針異常(Null Pointer Exception)


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 呈贡县| 微山县| 双桥区| 旬阳县| 阿荣旗| 资阳市| 蕉岭县| 贵州省| 隆安县| 汕尾市| 新巴尔虎左旗| 江达县| 龙川县| 凤庆县| 松江区| 麻阳| 五华县| 锡林浩特市| 乡宁县| 万源市| 香港| 定安县| 通州市| 湘潭市| 亚东县| 甘肃省| 扎赉特旗| 新乡市| 涿鹿县| 昌黎县| 库伦旗| 南皮县| 浮山县| 观塘区| 元朗区| 水富县| 团风县| 获嘉县| 四平市| 江孜县| 湘阴县|