qiyadeng

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

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

          首先我們看如下的示例

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


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

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

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

          1.判斷Collection是否為空。

          2.使用一些判斷方法。

          3.assert關鍵字。

          4.Assert類。

          5.異常處理。

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

          7.使用StringUtils類

          1.判斷Collection是否為空

          Collection 為空是指Collection中沒有元素。一些開發者如果碰到Collection中沒有元素的時候,經常return null,更好的做法是,你應該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關鍵字

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

          assert expression1

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

          另外一種使用方法

          assert expression1:expression2

          如果expression1返回false,那么系統將會拋出AssertError,并且詳細信息為expression2。

          示例:

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

          我使用getManager(null)來調用getManger方法,最后運行的結果是"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";
          }

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

          5.異常處理

          使用try catch處理異常或是檢查變量是否為空。

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

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

          將會發生"java.lang.NullPointerException",為了處理這個異常,我們應該使用try catch來處理異常或者是檢查變量是否為null。

          try-catch方法

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

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

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

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

          錯誤的寫法

          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()等等,更多的你可以參考文檔

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

          原創文章,轉載請注明: 轉載自http://www.qiyadeng.com/

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


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


          網站導航:
           
          主站蜘蛛池模板: 天门市| 辽中县| 漳浦县| 安仁县| 临邑县| 陆河县| 民乐县| 太仆寺旗| 罗定市| 高要市| 洛扎县| 隆德县| 车致| 安康市| 巫溪县| 张家界市| 高陵县| 汝州市| 南陵县| 福海县| 大埔县| 沧州市| 万山特区| 太和县| 察隅县| 北安市| 紫金县| 新平| 讷河市| 当雄县| 阜康市| 阜新市| 西林县| 双流县| 安西县| 陇西县| 同仁县| 息烽县| 冕宁县| 太康县| 玉环县|