詳解Java中NullPointerException異常的原因和解決辦法
1、NullPointerException異常原因
一般空指針的原因就是:當(dāng)前正在使用的變量沒(méi)有對(duì)應(yīng)的值
也就是說(shuō):當(dāng)前正在使用的變量沒(méi)有引用指向?qū)?yīng)的值/對(duì)象
也可以這樣說(shuō):Null Pointer就相當(dāng)于Null Reference
如下面的代碼都會(huì)報(bào)空指針異常:
public class Main { public static void main(String[] args) { String str1 = null; System.out.println(str1.toLowerCase()); //NullPointerException } } public class Main { String str2; //默認(rèn)值為null public static void main(String[] args) { Main ma = new Main(); System.out.println(ma.str2.toLowerCase()); //NullPointerException } }
因?yàn)槌蓡T變量str2和局部變量str1都是默認(rèn)為null,所以都沒(méi)有具體的指向某個(gè)值/對(duì)象
定位NullPointerException
如果產(chǎn)生了NullPointerException,例如,調(diào)用a.b.c.x()時(shí)產(chǎn)生了NullPointerException,原因可能是:
- a是null;
- a.b是null;
- a.b.c是null;
確定到底是哪個(gè)對(duì)象是null以前只能打印這樣的日志:
- System.out.println(a);
- System.out.println(a.b);
- System.out.println(a.b.c);
如下面的代碼:
public class test20210629 { public static void main(String[] args) { Person p = new Person(); System.out.println(p.address.city); //輸出:null System.out.println(p.name[0]); //輸出:null System.out.println(p.address.city.toLowerCase()); //空指針異常 System.out.println(p.name[0].toLowerCase()); //空指針異常 } } class Person { String[] name = new String[2]; Address address = new Address(); } class Address { String city; String street; String zipcode; }
總結(jié):
空指針發(fā)生的原因:一個(gè)變量A沒(méi)有值(或沒(méi)有指向?qū)?yīng)的對(duì)象),然后直接使用A的方法,或者將A當(dāng)成參數(shù)傳給其他對(duì)象/方法使用,就會(huì)報(bào)空指針異常!
2、NullPointerException異常解決辦法
第一步,先看一下異常是怎么產(chǎn)生的,在輸入一個(gè)這樣的地址:http://localhost:8083/***/***/***/***?productId=564564564573534,在控制臺(tái)就會(huì)如圖所報(bào)錯(cuò)
第二步,要解決這樣的空指針錯(cuò)誤,就先要找到出錯(cuò)誤的JAVA代碼,點(diǎn)擊就可以,如圖:
第三步,定位到j(luò)ava代碼后,在debug啟動(dòng)項(xiàng)目,并添加斷點(diǎn),怎么啟動(dòng)debug:http://jingyan.baidu.com/article/19020a0a65e142529c284241.html
第四步,繼續(xù)第一步的地址,在debug的模式下可以看到此字段的值是Null, 如圖:
第五步,輸入正確的productId,如正確的鏈接是:http://localhost:8083/***/***/***/***?productId=47681438955545,如圖,debug模式下此字段就不是null,如圖:
第六步,如果沒(méi)有其他錯(cuò)誤的話,此時(shí)頁(yè)面也應(yīng)該打開(kāi)了
到此這篇關(guān)于詳解Java中NullPointerException異常的原因和解決辦法的文章就介紹到這了,更多相關(guān)Java NullPointerException異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法分析
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法,結(jié)合實(shí)例形式分析了Bean的作用域singleton和prototype相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11詳解eclipse下創(chuàng)建第一個(gè)spring boot項(xiàng)目
本文詳細(xì)介紹了創(chuàng)建第一個(gè)基于eclipse(eclipse-jee-neon-3-win32-x86_64.zip)+spring boot創(chuàng)建的項(xiàng)目。2017-04-04springboot+spring?data?jpa實(shí)現(xiàn)新增及批量新增方式
這篇文章主要介紹了springboot+spring?data?jpa實(shí)現(xiàn)新增及批量新增方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Springboot從配置文件properties讀取字符串亂碼的解決
這篇文章主要介紹了Springboot從配置文件properties讀取字符串亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實(shí)現(xiàn)
Java中的ArrayList是一種基于數(shù)組實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),支持動(dòng)態(tài)擴(kuò)容和隨機(jī)訪問(wèn)元素,可用于實(shí)現(xiàn)順序表等數(shù)據(jù)結(jié)構(gòu)。ArrayList在內(nèi)存中連續(xù)存儲(chǔ)元素,支持快速的隨機(jī)訪問(wèn)和遍歷。通過(guò)學(xué)習(xí)ArrayList的實(shí)現(xiàn)原理和使用方法,可以更好地掌握J(rèn)ava中的數(shù)據(jù)結(jié)構(gòu)和算法2023-04-04Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java對(duì)象簡(jiǎn)單實(shí)用案例之計(jì)算器實(shí)現(xiàn)代碼2016-11-11如何將SpringBoot項(xiàng)目打成?war?包并部署到Tomcat
這篇文章主要介紹了如何將SpringBoot項(xiàng)目?打成?war?包?并?部署到?Tomcat,當(dāng)前環(huán)境是windows,tomcat版本是8.5采用的springboot版本是2.2.3,本文結(jié)合實(shí)例代碼給大家詳細(xì)講解需要的朋友可以參考下2022-11-11使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)
這篇文章主要為大家詳細(xì)介紹了使用Springboot實(shí)現(xiàn)獲取某個(gè)城市當(dāng)天的天氣預(yù)報(bào)的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04SpringBoot項(xiàng)目加入沖突動(dòng)態(tài)監(jiān)測(cè)算法的實(shí)現(xiàn)
沖突動(dòng)態(tài)監(jiān)測(cè)算法是一種網(wǎng)絡(luò)通信中的沖突檢測(cè)方法,適用于無(wú)線網(wǎng)絡(luò)或其他共享傳輸介質(zhì)的環(huán)境,本文主要介紹了SpringBoot項(xiàng)目加入沖突動(dòng)態(tài)監(jiān)測(cè)算法的實(shí)現(xiàn),感興趣的可以了解一下2023-09-09