1. 程式人生 > >規避空指針異常

規避空指針異常

為什麽 size ger 怎麽辦 pub 屬性 添加 equals 文件

空指針異常概念:

  在面向對象的語言中,指針也是對象的引用。而空指針,就是指針的內容為空(也可以理解為這個指針沒有指向一塊內存)。由於這是一個空的指針,指向了聲明類型的類的空對象,所以在應用這個對象的屬性或者方法的時候,自然是錯誤的,也就是會報空指針異常。if語句判斷不會異常,只有操作時會出異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。

如何在開發中規避空指針異常,可以從以下幾點入手:

1、equals方法的使用,Object的equals方法容易拋空指針異常,應使用常量或確定有值的對象來調用equals。推薦使用java.util.Objects#equals(JDK7引入的工具類)。代碼如下:

public static boolean equals(Object a, Object b) {

return (a == b) || (a != null && a.equals(b));

}

正確的示範為:

技術分享圖片

技術分享圖片

錯誤示範為:

技術分享圖片

另外代碼中直接出現的含義不明的變量一定要加註釋,不然一堆魔法值會讓代碼的可讀性大大降低,只有優秀的程序員才能寫出人能讀懂的代碼。例如下面的不規範代碼,有沒有感覺讀起來十分的糾結。

技術分享圖片

技術分享圖片

2、對數據處理時添加必要的判空,但是需要註意的是一部分場景是不需要的,比如參數是其它系統傳過來,或者其他地方獲取的傳過來的,99.99%都不會為空,就沒有必要添加一個冗余的空判斷,這種情況也基本上不會出現。另外需要定義自己的工具類,隱藏實現,體現封裝/解耦的思想。盡量不要在業務代碼裏面直接調用第三方的工具類。這也是解耦的一種體現。如果我們不定義自己的工具類而是直接使用第三方的工具類有2個不好的地方:不同的人會使用不同的第三方工具庫,會比較亂。將來萬一要修改工具類的實現邏輯會很痛苦。

以最簡單的字符串判空為例,很多工具庫都有 StringUtils工具類,如果我們使用commons的工具類,一開始我們直接使用 StringUtils.isEmpty,字符串為空或者空串的時候會返回為true,後面業務改動,需要改成如果全部是空格的時候也會返回true,怎麽辦?我們可以改成使用 StringUtils.isBlank() 。看上去很簡單,對吧? 如果你有幾十個文件都調用了,那我們要改幾十個文件,是不是有點惡心?再後面發現,不只是英文空格,如果是全角的空格,也要返回為true,怎麽辦?StringUtils上的方法已經不能滿足我們的需求了,就不好改了。

3、所有的POJO類屬性必須使用包裝數據類型。為什麽這麽要求,是因為實體類與數據庫的列結果進行映射的時候,如果用基本數據類型,映射的過程中會自動拆箱,而數據庫的查詢結果可能是null,由於自動拆箱,用基本數據類型接收有NPE(空指針)風險。

1、Integer i = 10; //裝箱

2、int t = i; //拆箱,實際上執行了 int t = i.intValue();

如果i的值為null,自動拆箱調用方法必然會報空指針異常

4、spring的bean註入失敗導致空指針,參見另一篇文件spring的bean註入失敗的幾種原因。

  程序員都可以寫出機器可以讀懂的代碼,只有優秀的程序員才能寫出人能讀懂的代碼,在開發的過程中註意規避可能發生的異常,提高代碼的健壯性,應該是每個程序員的一種追求。

規避空指針異常