避免Java中的空指针异常
首先讓我們創(chuàng)建引發(fā)空指針異常的示例
private Boolean isFinished(String status) { if (status.equalsIgnoreCase("Finish")) { return Boolean.TRUE; } else { return Boolean.FALSE; } }在以前的方法中,如果我們將“ status”變量的值傳遞為null,則會在下一行引發(fā)Null Pointer Exception
if (status.equalsIgnoreCase("Finish")) {所以我們應該將我的代碼更改為以下代碼,以避免Null Pointer Exception
private Boolean isFinished(String status) {if ("Finish".equalsIgnoreCase(status)) {return Boolean.TRUE;} else {return Boolean.FALSE;}}在以前的方法中,如果將“ status”變量的值設置為null,則不會引發(fā)Null Pointer Exception。
如果您有object.equals(“ literal”) ,則應替換為“ literal” .equals(object) 。
如果您有object.equals(Enum.enumElement) ,則應替換為
Enum.enumElement.equals(object)。
通常,您可以確保對象沒有等于null值的對象的equals方法。
我將繼續(xù)提供更多最佳實踐和建議。
在第1部分的帖子中,我列出了如何在equalsIgnoreCase()方法和枚舉器中避免NPE ,今天我將寫以下案例
1-空集合
2-使用一些方法 3-斷言關鍵字 4-斷言類 5-異常處理 6-點語法太多 7- StringUtils類
1-空集合
空集合是沒有任何元素的集合。 一些開發(fā)人員為沒有元素的Collection返回空值,但這是false,您應該返回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 = "Mahmoud A. El-Sayed"; 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是Java 1.4中提供的關鍵字,它使您能夠測試關于代碼的假設。
assert關鍵字的語法
assert expression1 ;expression1是被評估的布爾表達式,如果為false,則系統(tǒng)將拋出AssertionError而沒有詳細消息
assert expression1 : expression2 ;expression1是被評估的布爾表達式,如果為false,系統(tǒng)將拋出AssertionError并且詳細消息為expression2
例如,在我的帖子中,我想斷言表達式不為空,那么我應該在下面的代碼中編寫
public static String getManager(String employeeId) { assert (employeeId != null) : "employeeId must be not null"; return "Mahmoud A. El-Sayed"; } 如果我嘗試使用getManager(null)調用getManager方法;
它將引發(fā)“ java.lang.AssertionError:employeeId不能為空”
在運行代碼以啟用斷言時,請注意在java選項中使用-enableassertion 。
4-斷言類
斷言類存在于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 "Mahmoud A. El-Sayed"; } 如果我嘗試使用getManager(null)調用getManager方法;
它將引發(fā)“ java.lang.IllegalArgumentException:employeeId必須不為null”
5-異常處理
我應該小心使用try catch語句或檢查變量的空值進行異常處理
例如
我將使用以下代碼進行校準
String managerId = getManager("A015"); System.out.println(managerId.toString());它將引發(fā)“ java.lang.NullPointerException” ,因此要處理此異常,我應該使用try catch或檢查空值
嘗試catch語句
我將調用代碼更改為以下代碼
String managerId = getManager("A015"); try { System.out.println(managerId.toString()); } catch (NullPointerException npe) { //write your code here }b-空值檢查
我將調用代碼更改為以下代碼
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類
StringUtils類是org.apache.commons.lang包的一部分,我可以使用它來避免NPE,特別是它的所有方法都是null安全的
例如StringUtils。 IsEmpty(), StringUtils。 IsBlank(), StringUtils.equals() 等。
您可以從這里閱讀此類的規(guī)范
結束語編寫代碼時,請始終注意NullPointerException ,并猜測如何將其拋出到代碼中,并在代碼中編寫// TODO以便以后沒有更多時間解決它。
參考: 避免空指針異常的第1部分 , 避免空指針異常的第2部分,來自我們JCG合作伙伴 Mahmoud A. ElSay 在Oracle Dive博客中發(fā)表。
翻譯自: https://www.javacodegeeks.com/2012/06/avoid-null-pointer-exception-in-java.html
總結
以上是生活随笔為你收集整理的避免Java中的空指针异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.lang.NoClassDef
- 下一篇: 火影忍者游戏电脑版好玩的游戏(火影忍者端