摘要:本文,棧長(zhǎng)將帶你了解什么是空指針,還有如何有效的避免空指針。如何避免空指針下面說(shuō)幾個(gè)空指針的幾個(gè)最常見(jiàn)的案例及解決之道。字符串比較,常量放前面這個(gè)時(shí)候可能為造成空指針異常,應(yīng)該把常量放前面,就能避免空指針異常。
空指針是我們 Java 開(kāi)發(fā)人員經(jīng)常遇到的一個(gè)基本異常,這是一個(gè)極其普遍但似乎又無(wú)法根治的問(wèn)題。
本文,棧長(zhǎng)將帶你了解什么是空指針,還有如何有效的避免空指針。
什么是空指針?當(dāng)一個(gè)變量的值為 null 時(shí),在 Java 里面表示一個(gè)不存在的空對(duì)象,沒(méi)有實(shí)際內(nèi)容,沒(méi)有給它分配內(nèi)存,null 也是對(duì)象成員變量的默認(rèn)值。
所以,一個(gè)對(duì)象如果沒(méi)有進(jìn)行初始化操作,這時(shí)候,如果你調(diào)用這個(gè)對(duì)象的方法或者變量,就會(huì)出現(xiàn)空指針異常。
如下面示例會(huì)發(fā)生空指針異常:
Object object = null; String string = object.toString();
從類結(jié)構(gòu)圖來(lái)看,空指針?biāo)菍儆谶\(yùn)行時(shí)異常 RuntimeException 的子類,它不是捕獲型的,只有在程序運(yùn)行時(shí)才可能報(bào)出來(lái),而且會(huì)造成程序中斷。
什么是運(yùn)行時(shí)異常及異常的分類請(qǐng)看這篇文章:一張圖搞清楚 Java 異常機(jī)制。如何避免空指針?
下面說(shuō)幾個(gè)空指針的幾個(gè)最常見(jiàn)的案例及解決之道。
1、字符串比較,常量放前面if(status.equals(SUCCESS)){ }
這個(gè)時(shí)候 status 可能為 null 造成空指針異常,應(yīng)該把常量放前面,就能避免空指針異常。
if(SUCCESS.equals(status)){ }
這個(gè)應(yīng)該在各種開(kāi)發(fā)規(guī)范里面都會(huì)提到,也是最基礎(chǔ)的。
2、初始化默認(rèn)值在對(duì)象初始化的時(shí)候給它一個(gè)默認(rèn)值或者默認(rèn)構(gòu)造實(shí)現(xiàn),如:
User user = new User(); String name = StringUtils.EMPTY;3、返回空集合
在返回一個(gè)集合的話,默認(rèn)會(huì)是 null,統(tǒng)一規(guī)范返回一個(gè)空集合。
舉個(gè) List 例子,如:
public List getUserList(){ List list = userMapper.gerUserList(); return list == null ? new ArrayList() : list; }
這樣接收方就不用擔(dān)心空指針異常了,也不會(huì)影響業(yè)務(wù)。
4、斷言斷言是用來(lái)檢查程序的安全性的,在使用之前進(jìn)行檢查條件,如果不符合條件就報(bào)異常,符合就繼續(xù)。
Java 中自帶的斷言關(guān)鍵字:assert,如:
assert name == null : "名稱不能為空";
輸出:
Exception in thread "main" java.lang.AssertionError: 名稱不正確
不過(guò)默認(rèn)是不啟動(dòng)斷言檢查的,需要要帶上 JVM 參數(shù):-enableassertions 才能生效。
Java 中這個(gè)用的很少,建議使用 Spring 中的,更強(qiáng)大,更方便好用。
Spring中的用法:
Assert.notNull(name,"名稱不能為空");5、Optional
Optional 是 JDK 8 新增的新特性,再也不用 != null 來(lái)判斷了,這個(gè)在一個(gè)對(duì)象里面的多個(gè)子對(duì)象連續(xù)判斷的時(shí)候非常有用。
這里不再詳細(xì)介紹了,具體看這篇文章:JDK8新特性之Optional。
這里大概介紹了 5 種,其實(shí)還有更多,如何避免空指針,一是要注意代碼編寫規(guī)范,二是要提高代碼素養(yǎng)。在Java技術(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字:Java,可以獲取更多棧長(zhǎng)整理的 Java 系列技術(shù)干貨。
大家都有什么高見(jiàn),歡迎留言分享!
本文原創(chuàng)首發(fā)于微信公眾號(hào):Java技術(shù)棧(id:javastack),關(guān)注公眾號(hào)在后臺(tái)回復(fù) "Java" 可獲取更多,轉(zhuǎn)載請(qǐng)?jiān)瓨颖A舯拘畔ⅰ?/pre>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73085.html
摘要:空指針異常,操作一個(gè)對(duì)象的方法或?qū)傩詴r(shí)會(huì)拋出這個(gè)異常。看一個(gè)示例它是受檢查異常,需要進(jìn)行手工捕獲。類轉(zhuǎn)換異常,將一個(gè)不是該類的實(shí)例轉(zhuǎn)換成這個(gè)類就會(huì)拋出這個(gè)異常。 異常是 Java 程序中經(jīng)常遇到的問(wèn)題,我想每一個(gè) Java 程序員都討厭異常,一 個(gè)異常就是一個(gè) BUG,就要花很多時(shí)間來(lái)定位異常問(wèn)題。 什么是異常及異常的分類請(qǐng)看這篇文章:一張圖搞清楚 Java 異常機(jī)制。 今天,棧長(zhǎng)來(lái)列...
摘要:關(guān)于的三個(gè)謊言,你一定要清楚。這是的整個(gè)知識(shí)體系圖譜,對(duì)于新手來(lái)說(shuō),沒(méi)必要學(xué)那么多。第四自動(dòng)化測(cè)試一切關(guān)于自動(dòng)化的東西,似乎都可以滿足,可以滿足大多數(shù)自動(dòng)化工作,提升工作效率。這都是正常的,千萬(wàn)別急著否定自己,懷疑自己。 ...
摘要:我們應(yīng)該考慮使用字符串常量調(diào)用方法來(lái)代替使用對(duì)象調(diào)用該方法。然而如果我們通過(guò)字符串常量來(lái)調(diào)用方法,執(zhí)行流程會(huì)正常進(jìn)行檢查方法的參數(shù)在執(zhí)行方法的方法體之前,務(wù)必對(duì)方法的參數(shù)進(jìn)行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...
摘要:換句話說(shuō),環(huán)境或應(yīng)用程序沒(méi)有處于請(qǐng)求操作的適當(dāng)狀態(tài)。項(xiàng)目中異常分析引發(fā)崩潰日志的流程分析解決辦法常見(jiàn)的出現(xiàn)場(chǎng)景狀態(tài)異常非法線程操作。導(dǎo)致的方法出來(lái)顯示消息位于該消息之后,遲遲沒(méi)有執(zhí)行。這時(shí)候,的超時(shí)檢測(cè)結(jié)束,刪除了服務(wù)中的記錄。 目錄介紹 1.1 java.lang.UnsatisfiedLinkError找不到so庫(kù)異常 1.2 java.lang.IllegalStateExce...
摘要:引自手冊(cè)是相對(duì)長(zhǎng)度單位。所有未經(jīng)調(diào)整的瀏覽器都符合。特點(diǎn)是新增的一個(gè)相對(duì)單位,根,這個(gè)單位引起了廣泛關(guān)注。目前,除了及更早版本外,所有瀏覽器均已支持。對(duì)于不支持它的瀏覽器,應(yīng)對(duì)方法也很簡(jiǎn)單,就是多寫一個(gè)絕對(duì)單位的聲明。 在他處看到一篇好文章,想記錄在自己的學(xué)習(xí)筆記中,原文作者看到我轉(zhuǎn)載若是介意,聯(lián)系我立馬就刪除,附上原文鏈接:http://www.huolg.net/html5/htm...
閱讀 2201·2023-04-26 00:00
閱讀 3345·2021-09-24 10:37
閱讀 3567·2021-09-07 09:58
閱讀 1555·2019-08-30 15:56
閱讀 2247·2019-08-30 13:11
閱讀 2339·2019-08-29 16:38
閱讀 1025·2019-08-29 12:58
閱讀 1926·2019-08-27 10:54