最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中NullPointerException異常的原因詳解以及解決方法

 更新時間:2020年08月06日 11:01:01   作者:Allen Chou  
這篇文章主要介紹了詳解Java中NullPointerException異常的原因詳解以及解決方法。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

NullPointerException是當您嘗試使用指向內(nèi)存中空位置的引用(null)時發(fā)生的異常,就好像它引用了一個對象一樣。

當我們聲明引用變量(即對象)時,實際上是在創(chuàng)建指向?qū)ο蟮闹羔?。考慮以下代碼,您可以在其中聲明基本類型的整型變量x:

int x;
x = 10;

在此示例中,變量x是一個整型變量,Java將為您初始化為0。當您在第二行中將其分配給10時,值10將被寫入x指向的內(nèi)存中。

但是,當您嘗試聲明引用類型時會發(fā)生不同的事情。請使用以下代碼:

Integer num;
num = new Integer(10);

第一行聲明了一個名為的變量num,但它不包含原始值。相反,它包含一個指針(因為類型Integer是一個引用類型)。既然你還沒有說什么指向Java,它將它設(shè)置為null,意思是“ 我什么都沒有指向”。

在第二行中,new關(guān)鍵字用于實例化(或創(chuàng)建)Integer類型的對象,并為指針變量num分配此對象。您現(xiàn)在可以使用解引用運算符.(點)來引用對象。

在當你聲明了一個變量,但是沒有創(chuàng)建一個對象,會發(fā)生Exception。如果您在創(chuàng)建num對象之前嘗試取消引用,則會得到一個NullPointerException。在最瑣碎的情況下,編譯器將捕獲問題并讓您知道“num可能尚未初始化”,但有時您編寫的代碼不會直接創(chuàng)建對象。

例如,您可能使用了如下的方法:

public void doSomething(SomeObject obj) {
  //do something to obj
}

在這種情況下,您沒有創(chuàng)建對象obj,而是假設(shè)它是在doSomething調(diào)用方法之前創(chuàng)建的。如果你像這樣調(diào)用方法:

doSomething(null);

在這種情況下obj為null。如果該方法旨在對傳入的對象執(zhí)行某些操作,則需要拋出異常,因為NullPointerException它是程序錯誤,程序員將需要該信息用于調(diào)試的目的。

或者,可能存在這樣的情況:該方法的目的不僅僅是對傳入的對象進行操作,因此可以接受空參數(shù)。在這種情況下,您需要檢查null參數(shù)并采取不同的行為。您還應(yīng)該在文檔中解釋這一點。例如,doSomething應(yīng)該最好寫成:

/**
 * @param obj An optional foo for ____. May be null, in which case 
 * the result will be ____.
 */
public void doSomething(SomeObject obj) {
  if(obj != null) {
    //do something
  } else {
    //do something else
  }
}

我如何解決它?

所以你有一個NullPointerException。應(yīng)該如何解決?讓我們舉一個簡單的例子,它拋出NullPointerException:

public class Printer {
  private String name;
 
  public void setName(String name) {
    this.name = name;
  }
 
  public void print() {
    printString(name);
  }
 
  private void printString(String s) {
    System.out.println(s + " (" + s.length() + ")");
  }
 
  public static void main(String[] args) {
    Printer printer = new Printer();
    printer.print();
  }
}

標識空值

第一步是確切地確定導(dǎo)致異常的值。為此,我們需要做一些調(diào)試。學(xué)習(xí)閱讀堆棧跟蹤很重要。這將顯示拋出異常的位置:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

在這里,我們看到在第13行拋出異常(在printString方法中)。查看該行并通過添加日志記錄語句或使用調(diào)試器來檢查哪些值為空。我們發(fā)現(xiàn)它s是null,并且調(diào)用length方法會拋出異常。我們可以看到程序在s.length()方法中刪除時停止拋出異常。

追蹤這些值來自哪里

接下來檢查此值的來源。按照該方法的調(diào)用者,我們可以看到,s與傳遞printString(name)的print()方法,并this.name為空。

跟蹤應(yīng)設(shè)置這些值的位置

在哪里this.name設(shè)置?在setName(String)方法中。通過一些更多的調(diào)試,我們可以看到根本沒有調(diào)用此方法。如果調(diào)用該方法,請確保檢查調(diào)用這些方法的順序,并且在print方法之后不調(diào)用set 方法。

這足以為我們提供一個解決方案:在調(diào)用printer.setName()之前添加調(diào)用printer.print()。

其他修正

該變量可以具有默認值(并且setName可以防止將其設(shè)置為null):

private String name = "";

任一print或printString方法可以檢查空,例如:

printString((name == null) ? "" : name);

或者您可以設(shè)計如下所示的類,以便name 始終具有非null值:

public class Printer {
  private final String name;
 
  public Printer(String name) {
    this.name = Objects.requireNonNull(name);
  }
 
  public void print() {
    printString(name);
  }
 
  private void printString(String s) {
    System.out.println(s + " (" + s.length() + ")");
  }
 
  public static void main(String[] args) {
    Printer printer = new Printer("123");
    printer.print();
  }
}

到此這篇關(guān)于詳解Java中NullPointerException異常的原因詳解以及解決方法的文章就介紹到這了,更多相關(guān)Java NullPointerException異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 選擇Spring Boot項目的內(nèi)嵌容器的理由

    選擇Spring Boot項目的內(nèi)嵌容器的理由

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了選擇Spring Boot項目的內(nèi)嵌容器,需要的朋友可以參考下
    2017-11-11
  • Java操作Word文檔的全面指南

    Java操作Word文檔的全面指南

    在Java開發(fā)中,操作Word文檔是常見的業(yè)務(wù)需求,廣泛應(yīng)用于合同生成、報表輸出、通知發(fā)布、法律文書生成、病歷模板填寫等場景,本文將全面介紹Java操作Word文檔的主流方案,需要的朋友可以參考下
    2025-07-07
  • IntelliJ IDEA中如何構(gòu)建Spring Boot的項目

    IntelliJ IDEA中如何構(gòu)建Spring Boot的項目

    這篇文章主要介紹了IntelliJ IDEA中如何構(gòu)建Spring Boot的項目問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring Boot整合web層實現(xiàn)過程詳解

    Spring Boot整合web層實現(xiàn)過程詳解

    這篇文章主要介紹了Spring Boot整合web層實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • JAVA中字符串函數(shù)subString的用法小結(jié)

    JAVA中字符串函數(shù)subString的用法小結(jié)

    本篇文章主要是對JAVA中字符串函數(shù)subString的用法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • Java Stopwatch類,性能與時間計時器案例詳解

    Java Stopwatch類,性能與時間計時器案例詳解

    這篇文章主要介紹了Java Stopwatch類,性能與時間計時器案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • SpringBoot之核心依賴和自動配置方式

    SpringBoot之核心依賴和自動配置方式

    這篇文章主要介紹了SpringBoot之核心依賴和自動配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • springboot單元測試兩種方法實例詳解

    springboot單元測試兩種方法實例詳解

    這篇文章主要介紹了springboot單元測試兩種方法實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java獲取MultipartFile文件后綴名的多種方法

    Java獲取MultipartFile文件后綴名的多種方法

    Java處理MultipartFile獲取后綴名的方法包括字符串操作、正則、Apache CommonsIO、Spring StringUtils等,建議根據(jù)項目依賴和需求選擇合適方式,本文通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2025-06-06
  • 鑒權(quán)認證+aop+注解+過濾feign請求的實例

    鑒權(quán)認證+aop+注解+過濾feign請求的實例

    這篇文章主要介紹了鑒權(quán)認證+aop+注解+過濾feign請求的實例講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

塔河县| 三明市| 眉山市| 扶沟县| 万全县| 洛宁县| 满城县| 枣庄市| 塔城市| 汕尾市| 东乌| 乌拉特前旗| 怀远县| 原阳县| 收藏| 青冈县| 晋宁县| 昌吉市| 四子王旗| 江西省| 多伦县| 西吉县| 五原县| 临武县| 富平县| 铜川市| 武汉市| 宁明县| 武宁县| 平南县| 小金县| 乌恰县| 马公市| 廉江市| 玉山县| 确山县| 黑水县| 九龙坡区| 墨脱县| 越西县| 射阳县|