java 出現(xiàn)NullPointerException的原因及解決辦法
java 出現(xiàn)NullPointerException的原因及解決辦法
日常開(kāi)發(fā)過(guò)程中,最常見(jiàn)的異常莫過(guò)于NullPointerException,之前的時(shí)候,只是知道去找到報(bào)錯(cuò)的位置,然后去解決它,最近有空學(xué)習(xí)C語(yǔ)言,就去深究了下NullPointerException異常的本質(zhì)。
發(fā)生NullPointerException的情況:
- 調(diào)用 null 對(duì)象的實(shí)例方法。
- 訪(fǎng)問(wèn)或修改 null 對(duì)象的字段。
- 如果一個(gè)數(shù)組為null,試圖用屬性length獲得其長(zhǎng)度時(shí)。
- 如果一個(gè)數(shù)組為null,試圖訪(fǎng)問(wèn)或修改其中某個(gè)元素時(shí)。
- 在需要拋出一個(gè)異常對(duì)象,而該對(duì)象為 null 時(shí)。
首先,我們先找到Java.lang.NullPointerException這個(gè)類(lèi),內(nèi)容很簡(jiǎn)單:
package java.lang; /** * Thrown when a program tries to access a field or method of an object or an * element of an array when there is no instance or array to use, that is if the * object or array points to {@code null}. It also occurs in some other, less * obvious circumstances, like a {@code throw e} statement where the {@link * Throwable} reference is {@code null}. */ public class NullPointerException extends RuntimeException { private static final long serialVersionUID = 5162710183389028792L; /** * Constructs a new {@code NullPointerException} that includes the current * stack trace. */ public NullPointerException() { } /** * Constructs a new {@code NullPointerException} with the current stack * trace and the specified detail message. * * @param detailMessage * the detail message for this exception. */ public NullPointerException(String detailMessage) { super(detailMessage); } }
NullPointerException翻譯過(guò)來(lái)便是空指針,接下來(lái)我們首先要了解的是什么是指針,對(duì)于非C/C++的程序員來(lái)說(shuō),很多其它語(yǔ)言開(kāi)發(fā)者對(duì)指針的概念很模糊,說(shuō)白了,指針就是存儲(chǔ)變量的內(nèi)存地址,在c語(yǔ)言里面,NULL表示該指針不指向任何內(nèi)存單元,0表示指向地址為0的單元(這個(gè)單元一般是不能使用的)。先看一段C語(yǔ)言代碼:
void main() { int* i = NULL; printf("%#x\n", i); printf("%#x\n", &i); system("pause"); }
在C語(yǔ)言里,你可以讀取NULL本身的值(void *)0,即0,但是讀取它指向的值,那是非法的,會(huì)引發(fā)段錯(cuò)誤。而Java里面的NULL就是直接指向了0,上述也說(shuō)了,指向地址為0的單元,一般是不能使用的。
一句話(huà)總結(jié):因?yàn)橹赶蛄瞬豢墒褂玫膬?nèi)存單元,虛擬機(jī)無(wú)法讀取它的值,最終導(dǎo)致NullPointerException。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- java調(diào)用webservice的.asmx接口的使用步驟
- Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理
- Java調(diào)用WebService接口作測(cè)試
- JAVA調(diào)用SAP WEBSERVICE服務(wù)實(shí)現(xiàn)流程圖解
- JAVA WSIMPORT生成WEBSERVICE客戶(hù)端401認(rèn)證過(guò)程圖解
- Java 使用Axis調(diào)用WebService的示例代碼
- java使用xfire搭建webservice服務(wù)的過(guò)程詳解
- Java使用ExecutorService來(lái)停止線(xiàn)程服務(wù)
- Java解析調(diào)用webservice服務(wù)的返回XML串詳解
- 在spring boot中使用java線(xiàn)程池ExecutorService的講解
- Java中避免NullPointerException的方法總結(jié)
- Java xml出現(xiàn)錯(cuò)誤 javax.xml.transform.TransformerException: java.lang.NullPointerException
- Zend Studio for Eclipse的java.lang.NullPointerException錯(cuò)誤的解決方法
- java靜態(tài)工具類(lèi)注入service出現(xiàn)NullPointerException異常處理
相關(guān)文章
Qt5.9繼承QObject創(chuàng)建多線(xiàn)程實(shí)例
本文主要介紹了Qt5.9繼承QObject創(chuàng)建多線(xiàn)程實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算
C語(yǔ)言中有符號(hào)數(shù)和無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算默認(rèn)會(huì)將有符號(hào)數(shù)看成無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算,其中算術(shù)運(yùn)算默認(rèn)返回?zé)o符號(hào)數(shù),邏輯運(yùn)算當(dāng)然是返回0或1了。下面通過(guò)一個(gè)例子給大家分享C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算,一起看看吧2017-09-09使用opencv實(shí)現(xiàn)車(chē)道線(xiàn)檢測(cè)實(shí)戰(zhàn)代碼
這篇文章主要介紹了opencv車(chē)道線(xiàn)檢測(cè)實(shí)戰(zhàn),效果非常逼真,代碼簡(jiǎn)單易懂,對(duì)opencv車(chē)道線(xiàn)檢測(cè)實(shí)戰(zhàn)代碼感興趣的朋友一起看看吧2022-03-03C++實(shí)現(xiàn)商店倉(cāng)庫(kù)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)商店倉(cāng)庫(kù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03VS2022添加代碼模板的實(shí)現(xiàn)步驟(圖文)
使用代碼模板即可實(shí)現(xiàn)像內(nèi)置函數(shù)那樣,只需寫(xiě)幾個(gè)字母,便能提示自動(dòng)補(bǔ)全,本文主要介紹了VS2022添加代碼模板的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-06-06C++實(shí)現(xiàn)含附件的郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)含附件的郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式
這篇文章主要介紹了C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字
這篇文章主要為大家介紹了C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01