欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中NullPointerException的處理方法

 更新時間:2023年08月31日 08:28:43   作者:一一哥Sun  
這篇文章將帶大家來單獨(dú)看一個很常見的異常--空指針異常,這個可以說是每個Java程序員都必知的異常,所以我們不得不單獨(dú)學(xué)習(xí)一下,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

一. 簡介

你要問,Java中哪個異常最有名,那就不得不說NullPointerException!

NullPointerException,空指針異常,簡稱為NPE。這對Java程序員來說,可以說是一個無人不知、無人不曉的異常了!空指針異常往往是由于程序員沒有考慮到變量或者對象的值可能為null,或者沒有對null值進(jìn)行判斷導(dǎo)致的。所以當(dāng)我們試圖訪問null對象或者是對null對象進(jìn)行操作時,就會拋出NullPointerException異常。

NullPointerException異常在運(yùn)行時被拋出,如果不加以處理,會導(dǎo)致程序的中斷或者崩潰,因此我們在編寫Java程序時,要格外注意避免空指針異常的發(fā)生。

二. 產(chǎn)生原因

之所以會出現(xiàn)NullPointerException空指針異常,最根本的原因只有一個,那就是”對象為空“ ,這和很多單身狗的毛病一樣。也就是說,當(dāng)一個對象為null時,你還非得調(diào)用該對象的方法或字段,此時JVM就會產(chǎn)生NullPointerException,例如:

public static void main(String[] args) {
    String s = null;
    System.out.println(s.toUpperCase());
}

當(dāng)上面這段代碼運(yùn)行時,肯定會產(chǎn)生空指針異常,因為對象”s“是null。也就是我們沒有給該對象初始化賦值,它就是一個空殼子,你還非要使用它,這時就會出事。

三. 典型情況

雖然我們現(xiàn)在已經(jīng)知道引發(fā)空指針異常的原因了,但為了讓大家避免這種常見的異常,還是想給大家列舉幾個會引發(fā)空指針異常的典型情況。

3.1 對空對象調(diào)用方法或訪問屬性

當(dāng)一個對象為null時,它就沒有任何屬性和方法,如果我們在這個空對象上調(diào)用方法或訪問屬性,就會引發(fā)空指針異常。例如:

String str = null;
int length = str.length();  // 會拋出空指針異常

3.2 數(shù)組元素為null

在Java中,數(shù)組中的元素也可能會為null。如果我們在一個null數(shù)組元素上調(diào)用方法或訪問屬性,同樣會拋出空指針異常。例如:

String[] strs = new String[3];
strs[0] = "Hello";
strs[1] = null;
int length = strs[1].length();  // 會拋出空指針異常

3.3 參數(shù)為null

在調(diào)用方法時,如果參數(shù)為null,而方法內(nèi)部卻需要使用這個參數(shù),也會拋出空指針異常。例如:

public void printString(String str) {
    System.out.println(str.length());
}
String str = null;
printString(str);  // 會拋出空指針異常

四. 解決辦法

為了避免空指針異常的發(fā)生,我們需要加強(qiáng)對變量和對象的判斷,如果發(fā)現(xiàn)其值為null,就需要及早進(jìn)行處理,例如設(shè)置默認(rèn)值或者拋出異常。我們要知道,NullPointerException其實是一種代碼邏輯錯誤,遇到NullPointerException,要遵循”早暴露、早修復(fù)“的原則,不要使用catch語句來隱藏這種編碼錯誤! 比如下面這樣的代碼就不行:

// 錯誤示例: 捕獲NullPointerException
try {
    transferMoney(from, to, amount);
} catch (NullPointerException e) {
    //不要去捕獲空指針異常!
}

接下來給大家列舉幾個常用的避免空指針異常的方法。

4.1 使用條件判斷語句

通過判斷變量是否為null,可以避免空指針異常的發(fā)生。例如:

String str = null;
if (str != null) {
    int length = str.length();
}

4.2 使用對象初始化語句

我們在使用對象之前,確保要對該對象進(jìn)行初始化,這樣就可以保證對象不為null。例如:

String str = "";
int length = str.length();

我們在編寫業(yè)務(wù)邏輯時,使用空字符串""表示未填寫,而不要用默認(rèn)的null,""空串要比null安全得多,這可以避免很多NullPointerException。

4.3 使用Objects.requireNonNull()方法

Objects.requireNonNull()方法可以判斷參數(shù)是否為null,如果是null,則會拋出NullPointerException異常。例如:

String str = null;
Objects.requireNonNull(str, "str不能為空");  // 會拋出NullPointerException異常

4.4 返回空數(shù)組

如果我們使用數(shù)組時,某個數(shù)組沒有數(shù)據(jù),此時可以返回一個元素為空的數(shù)組,但是不要返回null,比如:

public String[] getData(String item) {
    if (getItem(item) == 0) {
        // 返回空數(shù)組而不是null:
        return new String[0];
    }
    ...
}

這樣調(diào)用方就不用檢查結(jié)果是否為null。

4.5 使用Optional

Optional是Java 8中引入的一個非常有用的類,用于解決null值問題。它是一個容器對象,可能包含非空值或空值,主要目的是減少代碼中的空指針異常,當(dāng)調(diào)用方一定要判斷某個對象是否為null時,就可以考慮使用Optional。接下來給大家編寫一個簡單的Optional案例。

import java.io.IOException;
import java.util.Optional;
/**
 * @author 一一哥Sun 
 */
public class Demo13 {
    public static void main(String[] args) throws IOException {
        String str="一一哥";
        //創(chuàng)建一個包含非空值的Optional對象。如果傳入的值為null,則會拋出NullPointerException異常。
        Optional<String> optional = Optional.of(str);
        if(optional.isPresent()) {
            String value = optional.get();
            System.out.println("value="+value);
        }else {
            System.out.println("字符串為空");
        }
        //ofNullable方法
        String name = null;
        //Optional.ofNullable靜態(tài)工廠方法,創(chuàng)建一個包含指定值的Optional對象,如果傳入的值為null,則返回一個空的Optional對象
        Optional<String> optionalName = Optional.ofNullable(name);
        String orElse = optionalName.orElse("Unknown");
        System.out.println("值="+orElse);
    }
}

我們可以使用 Optional.of 靜態(tài)工廠方法來創(chuàng)建一個包含非空值的 Optional 對象,如果傳入的值為 null,則會拋出 NullPointerException 異常。并可以使用 isPresent() 方法來判斷 Optional 對象是否包含非空值。如果包含非空值,則返回 true,否則返回 false。

也可以使用 Optional.ofNullable 靜態(tài)工廠方法,來創(chuàng)建一個包含指定值的 Optional 對象,如果傳入的值為 null,則會返回一個空的 Optional對象。然后使用 orElse() 方法來獲取 Optional 對象中包含的值,如果 Optional 對象為空,則返回指定的默認(rèn)值。

關(guān)于Optional的用法還有很多,以后會出一個Java新特性的專題系列,這里就不再細(xì)說了,敬請期待哦。

4.6 定位空指針異常

當(dāng)我們編寫的代碼真的產(chǎn)生了空指針異常,那該怎么辦呢?前面就跟大家說過,產(chǎn)生空指針異常的根本原因就是因為”對象為空“,所以解決的辦法就是先找到這個為空的對象,然后給這個對象賦值,只要對象不為空,這個空指針異常就解決了。聽起來也不難,但真的開發(fā)時,有時候經(jīng)驗不豐富的程序員,可能一時半會還找不到是哪個對象為空了。因為我們的項目中,對象實在太多了!比如下面這樣的代碼:

a.b.c.method()

這里的a、b、c都是對象,假如就是這一行代碼產(chǎn)生了空指針,你說到底是哪個對象為空?有可能是a為空,也有可能是b,也有可能是c,通常我們得一個對象一個對象進(jìn)行判斷,比如通過打印日志進(jìn)行判斷:

System.out.println(a);
System.out.println(a.b);
System.out.println(a.b.c);

但是這樣寫代碼,就顯得啰嗦且低效!為了改善這種問題,在JDK 14中推出了新的API,JVM可以直接給出詳細(xì)的信息,告訴我們null對象到底是哪個。在JDK 14中,如果是上面的代碼產(chǎn)生了空指針異常,會出現(xiàn)這樣的提示信息:... because "....a.b" is null....意思是b對象為null。但該功能默認(rèn)是關(guān)閉的,我們需要給JVM添加一個-XX:+ShowCodeDetailsInExceptionMessages參數(shù)啟用它,如下:

java -XX:+ShowCodeDetailsInExceptionMessages Main.java

以上就是列舉出來的幾種避免及檢查空指針異常的常用方法,希望你可以掌握。

總之,我們在編寫Java程序時,要格外注意避免空指針異常的發(fā)生,加強(qiáng)對變量和對象的判斷,養(yǎng)成良好的編碼習(xí)慣,就可以極大地降低NullPointerException的產(chǎn)生。如果發(fā)現(xiàn)值為null,就需要及早進(jìn)行處理,避免程序中斷或者崩潰。

五. 結(jié)語

這樣,就把空指針這種特別常見的異常單獨(dú)給大家分析了一下,希望大家以后遇到這種異常能夠知道怎么解決。今天的重點內(nèi)容如下:

  • NullPointerException的根本原因是對象為空;
  • 對空指針異常要早暴露,早修復(fù),不要使用catch進(jìn)行捕獲;
  • 可以啟用Java 14的增強(qiáng)異常來定位空指針異常的產(chǎn)生位置。

以上就是詳解Java中NullPointerException的處理方法的詳細(xì)內(nèi)容,更多關(guān)于Java NullPointerException處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java面向?qū)ο?API(接口)與集合(ArrayList)

    java面向?qū)ο?API(接口)與集合(ArrayList)

    這篇文章主要介紹了Java語言面向?qū)ο蟮腁PI與集合,還是十分不錯的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來幫助
    2021-08-08
  • Mybatis-Plus更新時間字段不生效的解決

    Mybatis-Plus更新時間字段不生效的解決

    在使用Mybatis-Plus時,可能會遇到updateTime字段不自動更新的問題,通過分析,原因在于selectById獲取舊數(shù)據(jù)后,如果字段已有值,更新操作不會自動填充更新時間,可以通過直接在實體中設(shè)置更新時間或在更新操作時指定時間來解決此問題
    2024-09-09
  • IDEA 自動跳出括號的快捷鍵分享

    IDEA 自動跳出括號的快捷鍵分享

    這篇文章主要介紹了IDEA 自動跳出括號的快捷鍵分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 完美解決Get和Post請求中文亂碼的問題

    完美解決Get和Post請求中文亂碼的問題

    下面小編就為大家?guī)硪黄昝澜鉀QGet和Post請求中文亂碼的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 超詳細(xì)介紹idea中java程序打jar包的兩種方式

    超詳細(xì)介紹idea中java程序打jar包的兩種方式

    這篇文章主要介紹了超詳細(xì)介紹idea中java程序打jar包的兩種方式一種是可直接執(zhí)行的runnable jar文件,另一種是包含多個主類,運(yùn)行時需要指定主類全類名的jar包,感興趣的可以了解一下
    2020-07-07
  • Java獲取彩色圖像中的主色彩的實例代碼

    Java獲取彩色圖像中的主色彩的實例代碼

    這篇文章主要介紹了Java獲取彩色圖像中的主色彩的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringMVC?RESTFul實戰(zhàn)案例訪問首頁

    SpringMVC?RESTFul實戰(zhàn)案例訪問首頁

    這篇文章主要為大家介紹了SpringMVC?RESTFul實戰(zhàn)案例訪問首頁,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • mybatis的映射xml中動態(tài)設(shè)置orderby方式

    mybatis的映射xml中動態(tài)設(shè)置orderby方式

    這篇文章主要介紹了mybatis的映射xml中動態(tài)設(shè)置orderby方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java?springBoot初步使用websocket的代碼示例

    Java?springBoot初步使用websocket的代碼示例

    這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實現(xiàn)實時雙向通信的協(xié)議,適用于需要實時通信的應(yīng)用程序,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java給JFrame窗口設(shè)置熱鍵的方法實現(xiàn)

    Java給JFrame窗口設(shè)置熱鍵的方法實現(xiàn)

    這篇文章主要介紹了Java給JFrame窗口設(shè)置熱鍵的方法實現(xiàn),文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論