日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Java NullPointerException-如何在Java中有效处理空指针

發(fā)布時間:2023/12/13 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 Java NullPointerException-如何在Java中有效处理空指针 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java NullPointerException是未經(jīng)檢查的異常,并且進(jìn)行了擴(kuò)展RuntimeException。NullPointerException不會強制我們使用catch塊來處理它。

1.為什么在代碼中出現(xiàn)NullPointerException

NullPointerException是代碼中您嘗試訪問/修改尚未初始化的對象的情況。從本質(zhì)上講,它意味著對象引用變量沒有指向任何地方,并且不指向任何內(nèi)容或為“null”。一個拋出空指針異常的示例Java程序。

package com.howtodoinjava.demo.npe;

public class SampleNPE
{
public static void main(String[] args)
{
String s = null;
System.out.println( s.toString() ); // 's' is un-initialized and is null
}
}

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中存在錯誤。

if (StringUtils.isNotEmpty(obj.getvalue())){
String s = obj.getvalue();
....
}

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)行大量的空檢查。

例如:

List<string> data = null;

@SuppressWarnings("unchecked")
public List getDataDemo()
{
if(data == null)
return Collections.EMPTY_LIST; //Returns unmodifiable list
return data;
}

使用上述方法的用戶即使錯過了空檢查,也不會看到難看的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)

代替在下面的代碼中編寫字符串比較

public class SampleNPE {
public void demoEqualData(String param) {
if (param.equals("check me")) {
// some code
}
}
}

像這樣寫上面的代碼。即使參數(shù)作為null傳遞,這也不會在NPE中引起。

public class SampleNPE {
public void demoEqualData(String param) {
if ("check me".equals(param)) // Do like this
{
// some code
}
}
}

4.可用的NullPointerException安全操作

4.1。運算符實例

instanceof運算符是NPE安全的。因此,instanceof null總是返回false。它不會導(dǎo)致NullPointerException。如果您記住這一事實,則可以消除混亂的條件代碼。

// Unnecessary code
if (data != null &amp;&amp; data instanceof InterestingData) {
}

// Less code. Better!!
if (data instanceof InterestingData) {
}

4.2。訪問類的靜態(tài)成員

如果您要處理靜態(tài)變量或靜態(tài)方法,則即使您的引用變量指向null,也不會得到null指針異常,因為靜態(tài)變量和方法調(diào)用是在編譯時根據(jù)類名綁定的,并且與對象無關(guān)

MyObject obj = null;
String attrib = obj.staticAttribute; //no NullPointerException because staticAttribute is static variable defined in class MyObject

5.如果必須在某些地方允許NullPointerException怎么辦

Joshua bloch在有效的Java中說:“可以說,所有錯誤的方法調(diào)用都可以歸結(jié)為非法論點或非法狀態(tài),但是其他例外通常用于某些種類的非法論據(jù)和狀態(tài)。如果調(diào)用者在某個參數(shù)中傳遞了null,而該參數(shù)禁止使用null值,則約定NullPointerException將拋出而不是IllegalArgumentException。

因此,如果必須NullPointerException在代碼的某些地方允許使用,則請確保使它們比通常具有更多的信息性??聪旅娴睦樱?/p>

package com.howtodoinjava.demo.npe;

public class SampleNPE {
public static void main(String[] args) {
// call one method at a time
doSomething(null);
doSomethingElse(null);
}

private static String doSomething(final String param) {
System.out.println(param.toString());
return "I am done !!";
}

private static String doSomethingElse(final String param) {
if (param == null) {
throw new NullPointerException(
" :: Parameter 'param' was null inside method 'doSomething'.");
}
System.out.println(param.toString());
return "I am done !!";
}
}

這兩個方法調(diào)用的輸出是這樣的:

Exception in thread "main" java.lang.NullPointerException
at com.howtodoinjava.demo.npe.SampleNPE.doSomething(SampleNPE.java:14)
at com.howtodoinjava.demo.npe.SampleNPE.main(SampleNPE.java:8)

Exception in thread "main" java.lang.NullPointerException: :: Parameter 'param' was null inside method 'doSomething'.
at com.howtodoinjava.demo.npe.SampleNPE.doSomethingElse(SampleNPE.java:21)
at com.howtodoinjava.demo.npe.SampleNPE.main(SampleNPE.java:8)

顯然,第二個堆棧跟蹤更有用,并且使調(diào)試容易。

總結(jié)

以上是生活随笔為你收集整理的Java NullPointerException-如何在Java中有效处理空指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。