Java判斷null的幾種方式及適用場(chǎng)景分析
在 Java 中,判斷對(duì)象是否為 null 是編程中最常見的操作之一。以下是幾種主要的判斷方式及其適用場(chǎng)景:
一、直接使用 == null(最基礎(chǔ))
if (obj == null) {
// 對(duì)象為 null 的處理邏輯
}- 優(yōu)點(diǎn):簡(jiǎn)單直接,性能最優(yōu)(無(wú)額外方法調(diào)用)。
- 缺點(diǎn):需要手動(dòng)處理每個(gè)對(duì)象,代碼冗余。
- 適用場(chǎng)景:任何場(chǎng)景,尤其是性能敏感的代碼。
二、Objects.isNull ()(JDK 8+)
import java.util.Objects;
if (Objects.isNull(obj)) {
// 對(duì)象為 null 的處理邏輯
}- 優(yōu)點(diǎn):語(yǔ)義清晰,Null 安全(傳入 null 不會(huì) NPE)。
- 缺點(diǎn):本質(zhì)是對(duì)
== null的封裝,性能略低于直接判斷。 - 適用場(chǎng)景:代碼可讀性要求高,避免空指針風(fēng)險(xiǎn)。
三、Objects.nonNull ()(JDK 8+)
if (Objects.nonNull(obj)) {
// 對(duì)象不為 null 的處理邏輯
}- 優(yōu)點(diǎn):與
Objects.isNull()配對(duì),語(yǔ)義明確。 - 適用場(chǎng)景:與 Stream、Optional 等結(jié)合使用。
四、Optional 類(JDK 8+)
import java.util.Optional;
Optional<String> optional = Optional.ofNullable(obj);
if (optional.isPresent()) {
// 對(duì)象不為 null 的處理邏輯
} else {
// 對(duì)象為 null 的處理邏輯
}
// 更優(yōu)雅的用法(避免 if-else)
optional.ifPresent(value -> System.out.println(value));- 優(yōu)點(diǎn):強(qiáng)制開發(fā)者處理 null 情況,避免 NPE;支持鏈?zhǔn)讲僮鳌?/li>
- 缺點(diǎn):代碼略顯繁瑣,適合復(fù)雜流程處理。
- 適用場(chǎng)景:處理可能缺失值的函數(shù)式編程,避免深層嵌套的 null 檢查。
五、Apache Commons Lang(第三方庫(kù))
import org.apache.commons.lang3.ObjectUtils;
if (ObjectUtils.isEmpty(obj)) {
// 對(duì)象為 null 或空(適用于字符串、集合等)
}
if (ObjectUtils.isNotEmpty(obj)) {
// 對(duì)象不為 null 且非空
}- 優(yōu)點(diǎn):提供更豐富的空值判斷(如空字符串、空集合)。
- 缺點(diǎn):需引入依賴。
- 適用場(chǎng)景:需要統(tǒng)一處理多種類型空值的場(chǎng)景。
六、StringUtils(Apache Commons Lang)
專門用于字符串的空值判斷:
import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
// 字符串為 null、空字符串或僅含空格
}
if (StringUtils.isEmpty(str)) {
// 字符串為 null 或空字符串(不檢查空格)
}- 優(yōu)點(diǎn):處理字符串時(shí)更全面,避免
str.length() == 0的 NPE 風(fēng)險(xiǎn)。 - 適用場(chǎng)景:字符串處理場(chǎng)景。
七、三元運(yùn)算符(簡(jiǎn)化賦值)
// 對(duì)象為 null 時(shí)賦默認(rèn)值
String result = (obj == null) ? "default" : obj;
// 等價(jià)于
String result;
if (obj == null) {
result = "default";
} else {
result = obj;
}- 優(yōu)點(diǎn):代碼簡(jiǎn)潔,適合簡(jiǎn)單賦值場(chǎng)景。
- 缺點(diǎn):邏輯復(fù)雜時(shí)可讀性下降。
八、使用斷言(開發(fā)階段)
import static org.junit.Assert.assertNotNull; // 在測(cè)試或開發(fā)階段強(qiáng)制要求對(duì)象非空 assertNotNull(obj, "對(duì)象不能為 null");
- 優(yōu)點(diǎn):快速定位問題,避免錯(cuò)誤數(shù)據(jù)流入后續(xù)流程。
- 缺點(diǎn):斷言默認(rèn)在生產(chǎn)環(huán)境禁用,不可用于業(yè)務(wù)邏輯判斷。
- 適用場(chǎng)景:?jiǎn)卧獪y(cè)試、方法參數(shù)校驗(yàn)。
性能對(duì)比
| 方式 | 性能(相對(duì)) |
|---|---|
== null | 最快 |
Objects.isNull() | 接近 == |
Optional | 較慢(涉及對(duì)象創(chuàng)建) |
最佳實(shí)踐
- 優(yōu)先使用
== null:簡(jiǎn)單場(chǎng)景直接判斷,性能最優(yōu)。 - 復(fù)雜流程用
Optional:避免深層嵌套的 null 檢查,提高代碼可讀性。 - 字符串處理用
StringUtils:避免str.isEmpty()的 NPE 風(fēng)險(xiǎn)。 - 集合 / 數(shù)組用
CollectionUtils.isEmpty():統(tǒng)一處理多種類型的空值。 - 避免過度使用
Optional:簡(jiǎn)單場(chǎng)景直接判斷更清晰,濫用會(huì)導(dǎo)致代碼冗余。
示例對(duì)比
傳統(tǒng)方式:
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null) {
System.out.println(user.getAddress().getCity());
}Optional 方式:
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(System.out::println);根據(jù)場(chǎng)景選擇合適的判斷方式,既能保證代碼健壯性,又能提升可讀性。
到此這篇關(guān)于Java判斷null的幾種方式的文章就介紹到這了,更多相關(guān)Java判斷null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot JS-SDK自定義微信分享的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot JS-SDK自定義微信分享的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
監(jiān)控Spring Boot 項(xiàng)目運(yùn)行情況操作方法
在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到想要獲取到服務(wù)器應(yīng)用的運(yùn)行情況的場(chǎng)景,在微服務(wù)架構(gòu)下對(duì)于每個(gè)應(yīng)用運(yùn)行情況的監(jiān)控是保證系統(tǒng)高可用的關(guān)鍵,本文給大家介紹如何實(shí)現(xiàn)在Spring Boot的jar包中對(duì)系統(tǒng)的運(yùn)行情況進(jìn)行監(jiān)控操作,感興趣的朋友跟隨小編一起看看吧2024-08-08
elasticsearch數(shù)據(jù)信息索引操作action?support示例分析
這篇文章主要為大家介紹了elasticsearch數(shù)據(jù)信息索引操作action?support示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
微服務(wù)架構(gòu)之使用RabbitMQ進(jìn)行異步處理方式
本文介紹了RabbitMQ的基本概念、異步調(diào)用處理邏輯、RabbitMQ的基本使用方法以及在Spring Boot項(xiàng)目中使用RabbitMQ解決高并發(fā)問題,RabbitMQ是一種流行的消息隊(duì)列實(shí)現(xiàn),支持異步通信,可以有效解耦應(yīng)用程序的不同部分,并將任務(wù)分發(fā)給多個(gè)消費(fèi)者2025-02-02
Java開發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)
作為一名java開發(fā)程序員,不知道大家有沒有遇到過一些匪夷所思的bug。這些錯(cuò)誤通常需要您幾個(gè)小時(shí)才能解決。今天,小編總結(jié)一些常見的編碼錯(cuò)誤,然后給出解決方案。希望大家在日常編碼中能夠避免這樣的問題2022-12-12

