Java中?!=null?的判斷
空指針異常是出現(xiàn)頻率比較高的bug,在出現(xiàn)空指針時,很多小伙伴都是習(xí)慣性地加一個 !=null 的判斷,這個bug就解決了。
當(dāng)代碼中頻繁出現(xiàn) !=null 的判斷時,我們就會很頭疼,能不能高效、優(yōu)雅地做這個判斷?
答案當(dāng)然是可以的。
第一步 ,當(dāng)我們要做 !=null 的判斷時,請停頓一下,看一下我們要做判斷的這個數(shù)據(jù)是什么類型?
數(shù)據(jù)類型無非就是String字符串、Object/自定義對象、List集合、Array數(shù)組、Map集合等類型。
第二步 ,思考這個數(shù)據(jù)類型對應(yīng)的工具類有哪些?
String類型,對應(yīng)的工具類有StringUtils。
Object對象,對應(yīng)的工具類有ObjectUtils。
Array數(shù)組,對應(yīng)的工具類有Arrays。
List集合、Map集合對應(yīng)的工具類有Collections、CollectionUtils等。
這些工具類都是Java、Spring框架自帶的工具類。
第三步 ,使用對應(yīng)類型的工具類做判斷。
1、如果這個數(shù)據(jù)是String類型時,請使用StringUtils工具類。
String str = ""; StringUtils.isEmpty(str); // true
StringUtils工具類比較有針對性,是針對String字符串的工具類。
public static boolean isEmpty(@Nullable Object str) { return str == null || "".equals(str); }
在isEmpty方法中,既有為null的判斷,也有是否等于空字符串的判斷。
2、如果這個數(shù)據(jù)是Object類型,請使用ObjectUtils工具類。
Object obj = null; ObjectUtils.isEmpty(obj); // true
3、如果這個數(shù)據(jù)是Map類型,也可以使用ObjectUtils工具類。
Map<String,Object> map = Collections.emptyMap(); ObjectUtils.isEmpty(map);// true
4、如果這個數(shù)據(jù)是List類型,還可以使用ObjectUtils工具類。
List<Integer> list =Collections.EMPTY_LIST; ObjectUtils.isEmpty(list); // true
5、如果這個數(shù)據(jù)是數(shù)組類型,依舊可以使用ObjectUtils工具類。
// 數(shù)組 Object[] objArr = null; ObjectUtils.isEmpty(objArr); // true
ObjectUtils 中的isEmpty()這一個方法,分別可以對字符串、數(shù)組、Map集合、List集合進(jìn)行是否等于null的判斷。
這個isEmpty方法為什么能判斷這么多種數(shù)據(jù)類型呢?一起看下它的源碼。
public static boolean isEmpty(@Nullable Object obj) { // 判斷obj是否為null,如果是直接f if (obj == null) { return true; } // 判斷obj是否是Optional的子類 if (obj instanceof Optional) { // 如果是,則調(diào)用isPresent方法判斷是否為null return !((Optional) obj).isPresent(); } // 判斷obj是否是CharSequence的子類 if (obj instanceof CharSequence) { // 如果是,則獲取長度,長度等于0時,就認(rèn)為這個obj是空字符串 return ((CharSequence) obj).length() == 0; } // 判斷obj是否為數(shù)組 if (obj.getClass().isArray()) { // 數(shù)組的長度等于0就認(rèn)為這個數(shù)組是空數(shù)組 return Array.getLength(obj) == 0; } // 判斷obj是否為Collection集合的子類 if (obj instanceof Collection) { // 用Collection子類的isEmpty方法判斷集合是否為空 return ((Collection) obj).isEmpty(); } // 判斷obj是否為Map接口的子類 if (obj instanceof Map) { // 如果是,則進(jìn)行強(qiáng)轉(zhuǎn),并用子類的isEmpty方法判斷集合是否為空 return ((Map) obj).isEmpty(); } // else return false; }
在這個靜態(tài)方法中,首先對傳入的obj對象進(jìn)行是否等于null的判斷,如果是則返回。如果不是null,對obj進(jìn)行數(shù)據(jù)類型進(jìn)行定位,然后根據(jù)數(shù)據(jù)類型進(jìn)行判斷。
在這個方法中,封裝了Optional、CharSequence、Array、Collection、Map數(shù)據(jù)類型,幾乎涵蓋所有的數(shù)據(jù)類型。
通過這段源碼,我們也可以看出,它對復(fù)雜類型的集合的判斷存在一些缺陷。也就是說它只判斷了集合的長度,集合的長度為0,就認(rèn)為集合是空的。
// 創(chuàng)建一個只有一個元素的List集合 List<Integer> list = Collections.singletonList(null); ObjectUtils.isEmpty(list); // false
上面的這段代碼,我們創(chuàng)建了一個只有一個元素、且這個元素為null的List集合。
如果是對象數(shù)組,數(shù)組里有一個對象,但這一個對象為null,這個判斷就失靈了。
ObjectUtils 類中對對象數(shù)組的判斷是另外一個isEmpty方法。
public static boolean isEmpty(@Nullable Object[] array) { return array == null || array.length == 0; }
因此在這2種情況下,我們再使用ObjectUtils的isEmpty方法就不合適了,我們需要對集合或數(shù)組里的每一個元素進(jìn)行判斷是否為null。
6、針對List集合中元素是否為空的正確判斷
Arrays.stream(list.toArray()).allMatch(ObjectUtils::isEmptyisNull);
這里用到了Arrays工具類。需要先把List集合轉(zhuǎn)換成數(shù)組,然后再使用Arrays工具類對數(shù)組里的元素逐一判斷是否為null。
7、針對Map集合是否為空為null的判斷
Map<String,Object> map = Collections.emptyMap(); CollectionUtils.isEmpty(map);
CollectionUtils工具類中isEmpty判斷方法源碼:
public static boolean isEmpty(@Nullable Map<?, ?> map) { return map == null || map.isEmpty(); }
map是否等于null,map集合是否為空,這一個方法中聚合了兩個判斷。我們直接調(diào)用它就可以減少我們的工作量。
除此之外,CollectionUtils工具類中還有針對List集合的isEmpty方法:
List<Integer> list = null; // 使用CollectionUtils工具類判斷l(xiāng)ist集合是否為空 CollectionUtils.isEmpty(list); // true
針對List集合的isEmpty源碼:
public static boolean isEmpty(@Nullable Collection<?> collection) { return collection == null || collection.isEmpty(); }
在這個方法中,既有為null的判斷,也有isEmpty的判斷,聚合了兩個判斷,我們直接調(diào)用它也可以減少我們的工作量。
最后總結(jié)一下
判斷一個數(shù)據(jù)是否為null,可以經(jīng)過三步,第一步思考屬于什么數(shù)據(jù)類型,第二步根據(jù)數(shù)據(jù)類型選擇正確的工具類,第三步,使用正確的工具類進(jìn)行判斷。
針對String字符串類型的數(shù)據(jù),直接使用StringUtils工具類。
針對除了String之外的數(shù)據(jù)類型都可以使用ObjectUtils工具類。
針對List集合、Map集合,除了ObjectUtils還可以使用CollectionUtils工具類進(jìn)行判斷。
針對數(shù)組和List集合中的子元素是否都為null的判斷,則需要遍歷判斷。
到此這篇關(guān)于Java中 !=null 的判斷的文章就介紹到這了,更多相關(guān)https://blog.csdn.net/qq_37844084/article/details/144914147內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Access?DB實現(xiàn)數(shù)據(jù)導(dǎo)入和解析
microsoft?office?access是由微軟發(fā)布的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它結(jié)合了?microsoft?jet?database?engine?和?圖形用戶界面兩項特點,是一種關(guān)系數(shù)據(jù)庫工具,本文給大家介紹了SpringBoot集成Access?DB實現(xiàn)數(shù)據(jù)導(dǎo)入和解析,需要的朋友可以參考下2024-11-11SpringMVC結(jié)構(gòu)簡介及常用注解匯總
這篇文章主要介紹了SpringMVC結(jié)構(gòu)簡介及常用注解匯總,幫助大家更好的理解和學(xué)習(xí)使用SpringMVC,感興趣的朋友可以了解下2021-03-03Java微信公眾平臺開發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第九步,關(guān)鍵字回復(fù)以及客服接口實現(xiàn),以及遇到該公眾號暫時無法提供服務(wù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04利用Java實現(xiàn)復(fù)制Excel工作表功能
這篇文章主要給大家介紹了關(guān)于如何利用Java實現(xiàn)復(fù)制Excel工作表功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12IntelliJ?IDEA?2021.3永久最新激活至2099年(親測有效)
最新版idea2021.3已出來,很多網(wǎng)友迫不及待的要升級idea2021最新版,今天小編抽空給大家整理了一篇教程關(guān)于idea2021.3最新激活教程,本文以idea2021.2.3為例通過圖文并茂的形式給大家分享激活詳細(xì)過程,感興趣的朋友參考下吧2020-12-12SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情
這篇文章主要介紹了SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情,通過用??MySQL??進(jìn)行一主一從的主從復(fù)制展開全文內(nèi)容,需要的朋友可以參考一下2022-08-08