Java判断对象是否为空的四种方法小结

 更新时间:2024年10月16日 09:48:30   作者:初学者杰克  
这篇文章主要介绍了Java判断对象是否为空的四种方法,判断对象是否为空有多种方法,包括使用==或!=运算符直接比较对象与null,使用Objects.isNull()方法,以及用instanceof运算符或Optional类进行更安全的空值处理,需要的朋友可以参考下

在 Java 中,判断对象是否为空可以使用以下几种方法:

1、使用 == 或 != 运算符比较对象引用与 null。例如:

if (myObject == null) {
    // myObject 为空
} else {
    // myObject 不为空
}

2、使用 Objects.isNull() 方法。这个方法的优点是可以处理 null 参数的情况,不会抛出 NullPointerException。例如:

if (Objects.isNull(myObject)) {
    // myObject 为空
} else {
    // myObject 不为空
}

3、使用对象的 instanceof 运算符。这种方法可以检查对象是否为特定的类型。例如:

if (myObject instanceof MyClass) {
    // myObject 不为空,并且是 MyClass 类型
} else {
    // myObject 为空或不是 MyClass 类型
}

4、使用 Optional 类。这是 Java 8 引入的一个功能强大的工具类,可以优雅地处理空值。例如:

Optional<MyClass> myOptional = Optional.ofNullable(myObject);
if (myOptional.isPresent()) {
    // myObject 不为空
    MyClass myInstance = myOptional.get();
} else {
    // myObject 为空
}

总的来说,选择哪种方法主要取决于具体的需求和编码习惯。需要注意的是,直接使用 == 或 != 运算符比较对象引用与 null 是最简单直接的方法,但可能会在某些情况下抛出 NullPointerException。使用 Objects.isNull() 和 Optional 类可以更安全地处理空值情况。

附:判断某个对象属性值都不为空/至少有一个属性值不为空

如果是字符串属性则不为null和不为""

有时候,controller参数接收json对象,我们需要判断该对象中的属性值是否都不为空(都是必须的)/至少有一个属性值不为空,其中字符串属性不为null和不为“”,如果对象参数多,controller里面遍历每一个属性去判断,代码冗余。

当然还有另外的方法,比如spring框架中的注解@NotNull,@NotBlank,@Valid。

import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Title:判断某个对象属性值都不为空,字符串属性不为空和不为空字符串
 * Description:利用类的反射获取,前提是javabean中的属性都是包装类
 * @author WZQ
 * @version 1.0.0
 * @date 2020/4/19
 */
public class ObjIsUtil {

    /**
     * 根据属性名获取属性值
     */
    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;
        }
    }

    /**
     * 判断对象中的属性值是否都不为空,字符串属性的需要判断空字符串
     */
    public static Boolean isAllNotNull(Object o) {
        //获取对象的属性数组,反射
        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;

            //当前属性名的值
            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;
    }

    /**
     * 判断对象中的属性值至少有一个不为空
     */
    public static Boolean oneNotNull(Object o) {
        //获取对象的属性数组,反射
        Field[] fields = o.getClass().getDeclaredFields();
        String name = "";
        for (int i = 0; i < fields.length; i++) {
            //属性名
            name = fields[i].getName();

            //当前属性名的值
            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
//    }

}

总结

到此这篇关于Java判断对象是否为空的四种方法的文章就介绍到这了,更多相关Java判断对象是否为空内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小编就为大家带来一篇Java接口RandomAccess全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • SpringBoot整合jasypt实现数据加密的步骤

    SpringBoot整合jasypt实现数据加密的步骤

    听说过jasypt吗?它可是一个超级流行的Java库哦,提供了简单又高效的加密和解密接口,整合jasypt后,我们的SpringBoot应用就能轻松处理敏感数据的加密和解密,而不必为复杂的加密算法头疼啦,下面给大家介绍SpringBoot整合jasypt实现数据加密的步骤,感兴趣的朋友一起看看吧
    2025-04-04
  • Java Stream中map与flatMap对比超详细教程

    Java Stream中map与flatMap对比超详细教程

    这篇文章主要介绍了Java Stream中map与flatMap对比的相关资料,map()用于一对一转换,而flatMap()用于一对多转换并合并结果,文章详细解释了每个方法的基本功能、典型应用场景和示例代码,需要的朋友可以参考下
    2025-05-05
  • Springboot以Repository方式整合Redis的方法

    Springboot以Repository方式整合Redis的方法

    这篇文章主要介绍了Springboot以Repository方式整合Redis的方法,本文通过图文并茂实例详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • java线程中start和run的区别详解

    java线程中start和run的区别详解

    这篇文章主要介绍了java线程中start和run的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SSH框架网上商城项目第7战之整合Struts2和Json

    SSH框架网上商城项目第7战之整合Struts2和Json

    SSH框架网上商城项目第7战之整合Struts2和Json,打通EasyUI和Struts2之间的交互,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java多线程并发执行demo代码实例

    Java多线程并发执行demo代码实例

    这篇文章主要介绍了Java多线程并发执行demo代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java真题实练掌握哈希表的使用

    Java真题实练掌握哈希表的使用

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-07-07
  • Java中锁的全面解析之类型、使用场景、优缺点及实现方式(示例代码)

    Java中锁的全面解析之类型、使用场景、优缺点及实现方式(示例代码)

    本文将从锁的基本概念出发,详细讲解Java中常见的锁类型、它们的使用场景、优缺点以及底层实现原理,并通过代码示例帮助读者深入理解,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Java分布式锁理论(redis、zookeeper))案例详解

    Java分布式锁理论(redis、zookeeper))案例详解

    zookeeper有个节点路径的概念,节点路径不能重复,保证了唯一性,这篇文章给大家介绍Java分布式锁理论(redis、zookeeper) 案例详解,感兴趣的朋友跟随小编一起看看吧
    2024-01-01

最新评论