Java判斷對(duì)象是否為空的四種方法小結(jié)
在 Java 中,判斷對(duì)象是否為空可以使用以下幾種方法:
1、使用 ==
或 !=
運(yùn)算符比較對(duì)象引用與 null
。例如:
if (myObject == null) { // myObject 為空 } else { // myObject 不為空 }
2、使用 Objects.isNull()
方法。這個(gè)方法的優(yōu)點(diǎn)是可以處理 null
參數(shù)的情況,不會(huì)拋出 NullPointerException
。例如:
if (Objects.isNull(myObject)) { // myObject 為空 } else { // myObject 不為空 }
3、使用對(duì)象的 instanceof
運(yùn)算符。這種方法可以檢查對(duì)象是否為特定的類型。例如:
if (myObject instanceof MyClass) { // myObject 不為空,并且是 MyClass 類型 } else { // myObject 為空或不是 MyClass 類型 }
4、使用 Optional
類。這是 Java 8 引入的一個(gè)功能強(qiáng)大的工具類,可以優(yōu)雅地處理空值。例如:
Optional<MyClass> myOptional = Optional.ofNullable(myObject); if (myOptional.isPresent()) { // myObject 不為空 MyClass myInstance = myOptional.get(); } else { // myObject 為空 }
總的來(lái)說(shuō),選擇哪種方法主要取決于具體的需求和編碼習(xí)慣。需要注意的是,直接使用 ==
或 !=
運(yùn)算符比較對(duì)象引用與 null
是最簡(jiǎn)單直接的方法,但可能會(huì)在某些情況下拋出 NullPointerException
。使用 Objects.isNull()
和 Optional
類可以更安全地處理空值情況。
附:判斷某個(gè)對(duì)象屬性值都不為空/至少有一個(gè)屬性值不為空
如果是字符串屬性則不為null和不為""
有時(shí)候,controller參數(shù)接收json對(duì)象,我們需要判斷該對(duì)象中的屬性值是否都不為空(都是必須的)/至少有一個(gè)屬性值不為空,其中字符串屬性不為null和不為“”,如果對(duì)象參數(shù)多,controller里面遍歷每一個(gè)屬性去判斷,代碼冗余。
當(dāng)然還有另外的方法,比如spring框架中的注解@NotNull,@NotBlank,@Valid。
import org.springframework.util.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Title:判斷某個(gè)對(duì)象屬性值都不為空,字符串屬性不為空和不為空字符串 * Description:利用類的反射獲取,前提是javabean中的屬性都是包裝類 * @author WZQ * @version 1.0.0 * @date 2020/4/19 */ public class ObjIsUtil { /** * 根據(jù)屬性名獲取屬性值 */ private static Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = o.getClass().getMethod(getter, new Class[]{}); Object value = method.invoke(o, new Object[]{}); return value; } catch (Exception e) { return null; } } /** * 判斷對(duì)象中的屬性值是否都不為空,字符串屬性的需要判斷空字符串 */ public static Boolean isAllNotNull(Object o) { //獲取對(duì)象的屬性數(shù)組,反射 Field[] fields = o.getClass().getDeclaredFields(); String name = ""; for (int i = 0; i < fields.length; i++) { //屬性名 name = fields[i].getName(); //pojos和dto含有serialVersionUID,得去掉該字段的判斷 if (name.equals("serialVersionUID")) continue; //當(dāng)前屬性名的值 Object fieldValueByName = getFieldValueByName(name, o); //值為null if (fieldValueByName == null) return false; //如果是String,判斷空字符串"" if (fields[i].getType().equals(String.class)){ String s = (String) fieldValueByName; if (StringUtils.isEmpty(s)){ return false; } } } return true; } /** * 判斷對(duì)象中的屬性值至少有一個(gè)不為空 */ public static Boolean oneNotNull(Object o) { //獲取對(duì)象的屬性數(shù)組,反射 Field[] fields = o.getClass().getDeclaredFields(); String name = ""; for (int i = 0; i < fields.length; i++) { //屬性名 name = fields[i].getName(); //當(dāng)前屬性名的值 Object fieldValueByName = getFieldValueByName(name, o); //如果是String,判斷空字符串"" if (fields[i].getType().equals(String.class)){ String s = (String) fieldValueByName; if (!StringUtils.isEmpty(s)){ return true; } }else{ //值為null if (fieldValueByName != null) return true; } } return false; } // public static void main(String[] args) { // Usertest usertest = new Usertest("1","name",1); // Usertest usertest1 = new Usertest("","",null); // Usertest usertest2 = new Usertest("1","",null); // Usertest usertest3 = new Usertest("1",null,1); // System.out.println(isAllNotNull(usertest));//true // System.out.println(isAllNotNull(usertest1));//false // System.out.println(isAllNotNull(usertest2));//false // System.out.println(isAllNotNull(usertest3));//false // System.out.println(oneNotNull(usertest));//true // System.out.println(oneNotNull(usertest1));//false // } }
總結(jié)
到此這篇關(guān)于Java判斷對(duì)象是否為空的四種方法的文章就介紹到這了,更多相關(guān)Java判斷對(duì)象是否為空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud微服務(wù)續(xù)約實(shí)現(xiàn)源碼分析詳解
這篇文章主要介紹了SpringCloud微服務(wù)續(xù)約實(shí)現(xiàn)源碼分析,服務(wù)續(xù)期和服務(wù)注冊(cè)非常相似,服務(wù)注冊(cè)在Eureka?Client程序啟動(dòng)之后開(kāi)啟,并同時(shí)開(kāi)啟服務(wù)續(xù)期的定時(shí)任務(wù)2022-11-11Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解
這篇文章主要介紹了Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類和 BigDecimal(大浮點(diǎn)數(shù))類用于大數(shù)運(yùn)算,這兩個(gè)類都繼承自 Number 類(抽象類),由于 BigInteger 在大數(shù)運(yùn)算中更常見(jiàn),需要的朋友可以參考下2023-09-09Java中面向?qū)ο蟮闹R(shí)點(diǎn)總結(jié)
Java是一門面向?qū)ο蟮恼Z(yǔ)言。對(duì)象是Java程序中的基本實(shí)體。除了對(duì)象之外Java程序同樣處理基本數(shù)據(jù)。下面這篇文章主要給大家總結(jié)了關(guān)于Java中面向?qū)ο蟮闹R(shí)點(diǎn),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02java對(duì)象轉(zhuǎn)成byte數(shù)組的3種方法
這篇文章主要為大家詳細(xì)介紹了java對(duì)象轉(zhuǎn)成byte數(shù)組的3種方法,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2018-06-06Spring中@PropertySource和@Value注解詳解
這篇文章主要介紹了Spring中@PropertySource和@Value注解詳解,@PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下2023-11-11JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄)
本文主要介紹了Spring Security 實(shí)現(xiàn)多種登錄方式(常規(guī)方式外的郵件、手機(jī)驗(yàn)證碼登錄),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01MybatisPlus使用注解的多對(duì)多級(jí)聯(lián)查詢方式
這篇文章主要介紹了MybatisPlus使用注解的多對(duì)多級(jí)聯(lián)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07