Java NullPointerException-如何在Java中有效处理空指针
Java NullPointerException是未經(jīng)檢查的異常,并且進(jìn)行了擴(kuò)展RuntimeException。NullPointerException不會強制我們使用catch塊來處理它。
1.為什么在代碼中出現(xiàn)NullPointerException
NullPointerException是代碼中您嘗試訪問/修改尚未初始化的對象的情況。從本質(zhì)上講,它意味著對象引用變量沒有指向任何地方,并且不指向任何內(nèi)容或為“null”。一個拋出空指針異常的示例Java程序。
|
|
2. Java NullPointerException通常發(fā)生的常見位置
好吧,由于各種原因,NullPointerException可能會出現(xiàn)在代碼中的任何位置,但是我根據(jù)自己的經(jīng)驗準(zhǔn)備了最常出現(xiàn)的地點清單。
在未初始化的對象上調(diào)用方法
方法中傳遞的參數(shù)是null
調(diào)用toString()對象的方法是null
在if不檢查null相等性的情況下比較塊中的對象屬性
對于像Spring這樣的依賴注入的框架來說,配置不正確
synchronized在一個對象上使用null
鏈接的語句,即單個語句中的多個方法調(diào)用
這不是詳盡的清單。還有其他幾個地方和原因。如果您還可以回憶起其他任何內(nèi)容,請發(fā)表評論。它也會幫助其他人(初學(xué)者)。
3.避免Java NullPointerException的最佳方法
3.1。三元運算符
如果不為null,則此運算符將得出左側(cè)的值,否則將評估右側(cè)。它具有如下語法:
布爾表達(dá)式?value1:value2;
如果expression計算為true,則整個表達(dá)式將返回value1,否則返回value2。它更像if-else構(gòu)造,但是更有效和更具表現(xiàn)力。為了防止NullPointerException(NPE),請像以下代碼一樣使用此運算符:
字符串str =(參數(shù)==空)“ NA”:參數(shù);
3.2。使用Apache Commons StringUtils進(jìn)行字符串操作
Apache commons lang是用于各種操作之王的幾個實用程序類的集合。其中之一是StringUtils.java。使用StringUtils.isNotEmpty()驗證作為參數(shù)傳遞的字符串是否為空或空字符串。如果不為null或為空;然后進(jìn)一步使用它。
其他類似的方法是StringUtils。IsEmpty()和StringUtils.equals()。他們在javadocs中聲稱,如果StringUtils.isNotBlank()拋出NPE,則API中存在錯誤。
|
|
3.3。很早檢查方法參數(shù)是否為空
您應(yīng)該始終將輸入驗證置于方法的開頭,以使其余代碼不必處理輸入錯誤的可能性。因此,如果有人傳遞空值,那么事情將在堆棧中早點破裂,而不是在較深的位置(根本問題很難識別)中破裂。
在大多數(shù)情況下,針對快速故障行為是一個不錯的選擇。
3.4。考慮原始而不是對象
當(dāng)對象引用指向無內(nèi)容時,將發(fā)生空問題。因此,盡可能多地使用原語始終是安全的,因為它們不會受到空引用的影響。所有原語都必須附加一些默認(rèn)值,因此請當(dāng)心。
3.5。仔細(xì)考慮鏈接方法調(diào)用
雖然鏈?zhǔn)秸Z句很容易在代碼中查看,但它們不是NPE友好的。一條分散在多行中的語句將為您提供堆棧跟蹤中第一行的行號,無論它出現(xiàn)在何處。
ref.method1().method2().method3().methods4();
這種鏈?zhǔn)秸Z句將僅打印“行號xyz中發(fā)生了NullPointerException”。調(diào)試這樣的代碼確實很難。避免此類呼叫。
3.6。使用String.valueOf()而不是toString()
如果必須打印任何對象的字符串表示形式,請不要使用object.toString()。這是NPE的非常軟的目標(biāo)。而是使用String.valueOf(object)。
即使object在第二種方法中為null,它也不會給出異常,并且將輸出null來輸出流。
3.7。避免從方法中返回null
避免NPE的一個很棒的技巧是返回空字符串或空集合,而不是返回null。在您的應(yīng)用程序中一致地執(zhí)行此操作。您會注意到,如果這樣做,則不需要進(jìn)行大量的空檢查。
例如:
|
|
使用上述方法的用戶即使錯過了空檢查,也不會看到難看的NPE。
3.8。不鼓勵傳遞空參數(shù)
我已經(jīng)看到一些方法聲明,其中方法需要兩個或多個參數(shù)。如果參數(shù)之一作為null傳遞,則方法以某種不同的方式起作用。避免這種情況。
相反,您應(yīng)該定義兩種方法;一個帶有單個參數(shù),第二個帶有兩個參數(shù)。強制傳遞參數(shù)。當(dāng)您在方法內(nèi)部編寫應(yīng)用程序邏輯時,這很有幫助,因為您可以確保方法參數(shù)不會為null。因此,您不會放置不必要的假設(shè)和斷言。
3.9。在“安全”非空字符串上調(diào)用String.equals(String)
代替在下面的代碼中編寫字符串比較
|
|
像這樣寫上面的代碼。即使參數(shù)作為null傳遞,這也不會在NPE中引起。
|
|
4.可用的NullPointerException安全操作
4.1。運算符實例
instanceof運算符是NPE安全的。因此,instanceof null總是返回false。它不會導(dǎo)致NullPointerException。如果您記住這一事實,則可以消除混亂的條件代碼。
|
|
4.2。訪問類的靜態(tài)成員
如果您要處理靜態(tài)變量或靜態(tài)方法,則即使您的引用變量指向null,也不會得到null指針異常,因為靜態(tài)變量和方法調(diào)用是在編譯時根據(jù)類名綁定的,并且與對象無關(guān)
|
|
5.如果必須在某些地方允許NullPointerException怎么辦
Joshua bloch在有效的Java中說:“可以說,所有錯誤的方法調(diào)用都可以歸結(jié)為非法論點或非法狀態(tài),但是其他例外通常用于某些種類的非法論據(jù)和狀態(tài)。如果調(diào)用者在某個參數(shù)中傳遞了null,而該參數(shù)禁止使用null值,則約定NullPointerException將拋出而不是IllegalArgumentException。
因此,如果必須NullPointerException在代碼的某些地方允許使用,則請確保使它們比通常具有更多的信息性??聪旅娴睦樱?/p>
|
|
這兩個方法調(diào)用的輸出是這樣的:
|
|
顯然,第二個堆棧跟蹤更有用,并且使調(diào)試容易。
總結(jié)
以上是生活随笔為你收集整理的Java NullPointerException-如何在Java中有效处理空指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么获得异常的详细信息 printSta
- 下一篇: win7添加usb3.0驱动(错误代码1