一文詳解Java如何優(yōu)雅地判斷對象是否為空
1. 前言
在實際項目中,我們經(jīng)常需要對各種變量或對象進行判空校驗。這是因為,如果不進行判空校驗,當遇到空值時,可能會導致程序出現(xiàn)NullPointerException異常。這是一種常見的運行時異常,它會在試圖訪問或操作空對象引用時發(fā)生。為了避免這種異常的出現(xiàn),我們需要在使用變量或對象之前,進行仔細的判空校驗,以確保它們的值是有效的,或者它們不是空值。通過進行判空校驗,我們可以更好地保證程序的穩(wěn)定性和可靠性,避免潛在的錯誤和異常。
2. 如何判斷為null
2.1 常用判斷
判斷一個對象是否為null有多種方式。除了你提到的java.util中的Objects.nonNull(obj)和hutool中的ObjectUtil,還有其他一些常見的方法。以下是這些方法的詳細描述:
- java.util.Objects.nonNull(obj)這是Java標準庫提供的一種方法,它檢查給定的對象是否為null。如果對象不為null,則返回true;否則返回false。
- hutool中的ObjectUtilHutool是一個Java工具包,提供了許多實用的工具方法。ObjectUtil類中也有一個判斷對象是否為null的方法。使用Hutool的ObjectUtil,你可以像這樣檢查一個對象是否為null:
ObjectUtil.isNotNull(obj)
- null != obj這是一種傳統(tǒng)的比較方式,直接使用"!="運算符來檢查一個對象是否為null。如果obj不為null,則表達式的結果為false;如果obj為null,則表達式的結果為true。
2.2 List的判空
像List這種比較特殊的在項目中可能不僅僅是判斷非空了。對于List來說不等于null和List.size()
不等于0是兩回事,公司也有實習生常常有把這兩個混淆的情況,list不等于null說明已經(jīng)初始化了,堆內存中有一塊屬于它的地盤,而size為0說明還沒往里面放東西,舉個例子說就是不等于null代表我現(xiàn)在有個瓶子,size大于0說明我向瓶子里裝水了。
來看一下源碼:
public boolean isEmpty(List list) { if (list != null && list.size() > 0) { return false; } else { return true; } }
相當于判斷瓶子里有沒有水(前提是瓶子已經(jīng)存在,若瓶子不存在,則會拋出NullPointerException
異常)。
所以通常情況下會連用list != null && list.size > 0
來判斷,或者直接使用HuTool中CollUtil工具的isEmpty。諸如此類的還有Set、Map等。
2.3 String的判空
這里還是用瓶子與水的概念,String為null時調用equals(String) 或 length() 等操作拋出 java.lang.NullPointerException。
private void test() { String str1 = null; //這里將拋出異常 if (str1.equals("")) { } //這里將拋出異常 if (str1.length() > 0) { } }
針對字符串判空有以下幾種方式:
1、大多數(shù)人使用的方法之一,直觀,方便,但效率低下:
if(a == null || a.equals(""));
2、比較字符串長度,高效:
if(a == null || a.length() == 0);
3、Java SE 6.0 才剛剛開始提供,效率和方法二差不多:
if(a == null || a.isEmpty());
當然還可以使用org.apache.commons.lang.StringUtils
工具。
StringUtils.isNotBlank(a);
- StringUtils.isNotBlank(null) = false
- StringUtils.isNotBlank(“”) = false
- StringUtils.isNotBlank(" ") = false
- StringUtils.isNotBlank(“bob”) = true
- StringUtils.isNotBlank(" bob ") = true
該工具類中還有個isNotEmpty()
方法,從注釋可以很明顯看出二者的差別
StringUtils.isNotEmpty(a);
- StringUtils.isNotEmpty(null) = false
- StringUtils.isNotEmpty(“”) = false
- StringUtils.isNotEmpty(" ") = true
- StringUtils.isNotEmpty(“bob”) = true
- StringUtils.isNotEmpty(" bob ") = true
2.4 Optional
Optional的出現(xiàn)就是用來防止NullpointException
的。常見的方法有:
.empty()
: 創(chuàng)建一個空的Optional實例.of(T t)
: 創(chuàng)建一個Optional 實例,為null時報異常.ofNullable(T t)
: 若t 不為null,創(chuàng)建Optional 實例,否則創(chuàng)建空實例isPresent()
: 判斷容器中是否有值ifPresent(Consume lambda)
: 容器若不為空則執(zhí)行括號中的Lambda表達式orElse(T t)
: 獲取容器中的元素,若容器為空則返回括號中的默認值orElseGet(Supplier s)
: 如果調用對象包含值,返回該值,否則返回s 獲取的值orElseThrow()
: 如果為空,就拋出定義的異常,如果不為空返回當前對象map(Function f)
: 如果有值對其處理,并返回處理后的Optional,否則返回Optional.empty()
flatMap(Function mapper)
: 與map 類似,要求返回值必須是OptionalT get()
: 獲取容器中的元素,若容器為空則拋出NoSuchElement
異常
先看個常見的示例:
baseInfo類中有布爾類型的屬性,是空返回false,不為空取其值,需要四行。
boolean blind = false; if (null != baseInfo.getBlind()) { blind = baseInfo.getBlind(); }
當使用Optional時,一行搞定,非常的優(yōu)雅。
boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse(false);
Java中的Optional 是一個可以為null的容器對象。如果值存在則isPresent()方法返回true。調用get()方法會返回該對象。
創(chuàng)建Optional對象的方式有三種:
- 創(chuàng)建一個空的Optional對象:Optional.empty()。
- 使用非null值創(chuàng)建Optional對象:Optional.of(T value)。
- 使用任意值創(chuàng)建Optional對象:Optional.ofNullable(T value)。
Optional對象的使用場景主要是處理空指針異常的情況,相當于一個容器,當往里面存放對象時,如果對象為空(null),Optional會返回一個空的Optional實例,反之會返回一個非空的Optional實例。
以下是使用Optional對象的示例:
Optional<String> optional = Optional.ofNullable("test"); optional.isPresent(); // true optional.get(); // "test" optional.orElse("fallback"); // "test" optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "t"
以上代碼中,首先創(chuàng)建了一個包含字符串"test"的Optional對象。然后使用isPresent()方法檢查該值是否為null,使用get()方法獲取該值。接下來使用ifPresent()方法檢查值是否存在,如果存在則執(zhí)行l(wèi)ambda表達式中的代碼。在這個例子中,輸出結果是"t"。
總結來說,Java中的Optional對象可以用于避免空指針異常的情況,它提供了一種更優(yōu)雅、更簡潔的方式來處理可能為空的值。
3. 總結
每種方法都有其適用的場景,鏈式編程也不例外。雖然它可以使代碼更優(yōu)雅,但可能會降低邏輯性和可讀性。因此,在項目中使用時,需要根據(jù)具體情況慎重考慮。
到此這篇關于Java如何優(yōu)雅地判斷對象是否為空的文章就介紹到這了,更多相關Java判斷對象是否為空內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象
這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02JavaWeb JDBC + MySql 通訊錄實現(xiàn)簡單的增刪改查功能案例詳解
這篇文章主要介紹了JavaWeb JDBC + MySql 通訊錄實現(xiàn)簡單的增刪改查功能,結合具體案例形式詳細分析了JavaWeb JDBC + MySql數(shù)據(jù)庫連接、增刪改查等相關操作技巧與注意事項,需要的朋友可以參考下2019-08-08