解決java.lang.NullPointerException報(bào)錯(cuò)以及分析出現(xiàn)的幾種原因
java.lang.NullPointerException出現(xiàn)的幾種原因:
1、字符串變量未初始化
2、接口類型的對(duì)象沒(méi)有用具體的類初始化,比如:
Map map // 會(huì)報(bào)錯(cuò)
Map map = new Map(); //則不會(huì)報(bào)錯(cuò)了
3、當(dāng)一個(gè)對(duì)象的值為空時(shí),你沒(méi)有判斷為空的情況。
4、字符串與文字的比較,文字可以是一個(gè)字符串或Enum的元素,如下會(huì)出現(xiàn)異常
String str = null;
if(str.equals(“Test”)){undefined
//這里的代碼將不會(huì)被觸發(fā),因?yàn)闀?huì)拋出java.lang.NullPointerException異常。
}
5、優(yōu)先使用String.valueOf()方法代替toString()
當(dāng)程序代碼需要對(duì)象的字符串表示形式時(shí),請(qǐng)避免使用該對(duì)象的toString方法。如果你的對(duì)象的引用等于null,NullPointerException則會(huì)拋出,使用靜態(tài)String.valueOf方法,該方法不會(huì)拋出任何異常并打印"null"
6、class被聲明了類型, 默認(rèn) class = null; 這樣在調(diào)用class中方法的時(shí)候系統(tǒng)只能給你個(gè)空指針異常, 給其實(shí)例化就好了:class = new Class();
7、返回null,方法的返回值不要定義成為一般的類型,而是用數(shù)組。這樣如果想要返回null的時(shí)候就能避免許多不必要的NullPointerException

總之,NullPointerException由RuntimeException派生出來(lái),是一個(gè)運(yùn)行時(shí)異常。其意指可能會(huì)在運(yùn)行的時(shí)候才會(huì)被拋出,一個(gè)變量是null,及只有其名,沒(méi)有實(shí)值內(nèi)容,也沒(méi)分配內(nèi)存,當(dāng)你要去取他的長(zhǎng)度,對(duì)他進(jìn)行操作就會(huì)出現(xiàn)NullPointException,所以聲明變量時(shí)最好給它分配好內(nèi)存空間,給予賦值,例如拿該變量與一個(gè)值比較時(shí),要么先做好該異常的處理要么給它進(jìn)行判斷先: if (str !=null && str “”){ …}
判斷一個(gè)String的實(shí)例s是否等于“a”時(shí),不要寫成s.equals(“a”),這樣容易拋NullPointerException,而寫成"a".equals(s)就可以避免這個(gè)問(wèn)題,不過(guò)對(duì)變量先進(jìn)行判空后再進(jìn)行操作更好,盡量避免返回null,方法的返回值不要定義成為一般的類型,用數(shù)組。這樣如果想要返回null的時(shí)候,就返回一個(gè)沒(méi)有元素的數(shù)組。就能避免許多不必要的NullPointerException
下圖為異常分布圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過(guò)程
工作之余,想要學(xué)習(xí)一下SpringBoot,通過(guò)網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項(xiàng)目并完成登入注冊(cè)的相關(guān)資料,需要的朋友可以參考下2022-10-10
Windows安裝Maven并配置環(huán)境的詳細(xì)步驟
Maven是一個(gè)非常流行的構(gòu)建和項(xiàng)目管理工具,用于Java開(kāi)發(fā),它提供了一個(gè)強(qiáng)大的依賴管理系統(tǒng)和一系列標(biāo)準(zhǔn)化的構(gòu)建生命周期,本文將指導(dǎo)您如何在Windows操作系統(tǒng)上安裝和配置Maven,需要的朋友可以參考下2023-05-05
Java對(duì)象數(shù)組的添加、刪除和遍歷代碼示例
在Java編程中,我們經(jīng)常需要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對(duì)象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下2024-04-04
SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法
這篇文章主要介紹了SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Java并發(fā)編程之詳解CyclicBarrier線程同步
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下2021-06-06
Java享元設(shè)計(jì)模式優(yōu)化對(duì)象創(chuàng)建提高性能和效率
Java享元設(shè)計(jì)模式通過(guò)共享可重用的對(duì)象,減少了系統(tǒng)中對(duì)象的數(shù)量,優(yōu)化了對(duì)象的創(chuàng)建和管理,提高了性能和效率。它是一種經(jīng)典的設(shè)計(jì)模式,適用于需要處理大量相似對(duì)象的應(yīng)用程序2023-04-04
Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式
這篇文章主要介紹了Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java中實(shí)現(xiàn)Comparable和Comparator對(duì)象比較
這篇文章主要針對(duì)Java中Comparable和Comparator對(duì)象進(jìn)行比較,感興趣的小伙伴們可以參考一下2016-02-02
java 線程池keepAliveTime的含義說(shuō)明
這篇文章主要介紹了java 線程池keepAliveTime的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
最新Spring Security實(shí)戰(zhàn)教程之Spring Security安全框架指南
SpringSecurity是Spring生態(tài)系統(tǒng)中的核心組件,提供認(rèn)證、授權(quán)和防護(hù)機(jī)制,以保護(hù)應(yīng)用免受各種安全威脅,它支持多種認(rèn)證方式,并通過(guò)攔截器和過(guò)濾器鏈進(jìn)行安全檢查,本文通過(guò)搭建SpringBoot+SpringSecurity項(xiàng)目,幫助如何快速上手并應(yīng)用SpringSecurity,感興趣的朋友一起看看吧2025-03-03

