国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:81日期:2022-08-27 13:17:52

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

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

int x;x = 10;

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

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

Integer num;num = new Integer(10);

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

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

在當(dāng)你聲明了一個變量,但是沒有創(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(); }}

標(biāo)識空值

第一步是確切地確定導(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()。

其他修正

該變量可以具有默認(rèn)值(并且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)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 霍林郭勒市| 胶南市| 通渭县| 东乌珠穆沁旗| 常熟市| 西盟| 阿勒泰市| 姚安县| 阜阳市| 潞城市| 四子王旗| 灵石县| 富蕴县| 安顺市| 常宁市| 名山县| 梅河口市| 阜宁县| 始兴县| 蛟河市| 正安县| 黄龙县| 鄂州市| 青田县| 化州市| 永宁县| 辽宁省| 阜南县| 达州市| 永胜县| 柳林县| 丹寨县| 临朐县| 湖南省| 中方县| 巴彦淖尔市| 古蔺县| 宁化县| 抚宁县| 浮梁县| 呈贡县|