Java中 !=null 的判断

 更新时间:2025年02月10日 09:39:10   作者:HOLLING  
空指针异常是出现频率比较高的bug,在出现空指针时,很多小伙伴都是习惯性地加一个 !=null 的判断,本文就来介绍一下如何使用,给感兴趣的可以了解下

空指针异常是出现频率比较高的bug,在出现空指针时,很多小伙伴都是习惯性地加一个 !=null 的判断,这个bug就解决了。

当代码中频繁出现 !=null 的判断时,我们就会很头疼,能不能高效、优雅地做这个判断?

答案当然是可以的。

第一步 ,当我们要做 !=null 的判断时,请停顿一下,看一下我们要做判断的这个数据是什么类型?

数据类型无非就是String字符串、Object/自定义对象、List集合、Array数组、Map集合等类型。

第二步 ,思考这个数据类型对应的工具类有哪些?

String类型,对应的工具类有StringUtils。

Object对象,对应的工具类有ObjectUtils。

Array数组,对应的工具类有Arrays。

List集合、Map集合对应的工具类有Collections、CollectionUtils等。

这些工具类都是Java、Spring框架自带的工具类。

第三步 ,使用对应类型的工具类做判断。

1、如果这个数据是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、如果这个数据是Object类型,请使用ObjectUtils工具类。

Object obj = null;
ObjectUtils.isEmpty(obj); // true

3、如果这个数据是Map类型,也可以使用ObjectUtils工具类。

Map<String,Object> map = Collections.emptyMap();
ObjectUtils.isEmpty(map);// true

4、如果这个数据是List类型,还可以使用ObjectUtils工具类。

List<Integer> list =Collections.EMPTY_LIST;
ObjectUtils.isEmpty(list); // true

5、如果这个数据是数组类型,依旧可以使用ObjectUtils工具类。

// 数组
Object[] objArr = null;
ObjectUtils.isEmpty(objArr); // true

ObjectUtils 中的isEmpty()这一个方法,分别可以对字符串、数组、Map集合、List集合进行是否等于null的判断。

这个isEmpty方法为什么能判断这么多种数据类型呢?一起看下它的源码。

public static boolean isEmpty(@Nullable Object obj) {
    // 判断obj是否为null,如果是直接f
    if (obj == null) {
      return true;
    }
    // 判断obj是否是Optional的子类
    if (obj instanceof Optional) {
      // 如果是,则调用isPresent方法判断是否为null
      return !((Optional) obj).isPresent();
    }
    // 判断obj是否是CharSequence的子类
    if (obj instanceof CharSequence) {
      // 如果是,则获取长度,长度等于0时,就认为这个obj是空字符串
      return ((CharSequence) obj).length() == 0;
    }
    // 判断obj是否为数组
    if (obj.getClass().isArray()) {
      // 数组的长度等于0就认为这个数组是空数组
      return Array.getLength(obj) == 0;
    }
    // 判断obj是否为Collection集合的子类
    if (obj instanceof Collection) {
      // 用Collection子类的isEmpty方法判断集合是否为空
      return ((Collection) obj).isEmpty();
    }
    // 判断obj是否为Map接口的子类
    if (obj instanceof Map) {
      // 如果是,则进行强转,并用子类的isEmpty方法判断集合是否为空
      return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

在这个静态方法中,首先对传入的obj对象进行是否等于null的判断,如果是则返回。如果不是null,对obj进行数据类型进行定位,然后根据数据类型进行判断。

在这个方法中,封装了Optional、CharSequence、Array、Collection、Map数据类型,几乎涵盖所有的数据类型。

通过这段源码,我们也可以看出,它对复杂类型的集合的判断存在一些缺陷。也就是说它只判断了集合的长度,集合的长度为0,就认为集合是空的。

// 创建一个只有一个元素的List集合
List<Integer> list = Collections.singletonList(null);
ObjectUtils.isEmpty(list); // false

上面的这段代码,我们创建了一个只有一个元素、且这个元素为null的List集合。

如果是对象数组,数组里有一个对象,但这一个对象为null,这个判断就失灵了。

ObjectUtils 类中对对象数组的判断是另外一个isEmpty方法。

public static boolean isEmpty(@Nullable Object[] array) {
return array == null || array.length == 0;
}

因此在这2种情况下,我们再使用ObjectUtils的isEmpty方法就不合适了,我们需要对集合或数组里的每一个元素进行判断是否为null。

6、针对List集合中元素是否为空的正确判断

Arrays.stream(list.toArray()).allMatch(ObjectUtils::isEmptyisNull);

这里用到了Arrays工具类。需要先把List集合转换成数组,然后再使用Arrays工具类对数组里的元素逐一判断是否为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集合是否为空,这一个方法中聚合了两个判断。我们直接调用它就可以减少我们的工作量。

除此之外,CollectionUtils工具类中还有针对List集合的isEmpty方法:

List<Integer> list = null;
// 使用CollectionUtils工具类判断list集合是否为空
CollectionUtils.isEmpty(list); // true

针对List集合的isEmpty源码:

public static boolean isEmpty(@Nullable Collection<?> collection) {
    return collection == null || collection.isEmpty();
}

在这个方法中,既有为null的判断,也有isEmpty的判断,聚合了两个判断,我们直接调用它也可以减少我们的工作量。

最后总结一下

判断一个数据是否为null,可以经过三步,第一步思考属于什么数据类型,第二步根据数据类型选择正确的工具类,第三步,使用正确的工具类进行判断。

针对String字符串类型的数据,直接使用StringUtils工具类。

针对除了String之外的数据类型都可以使用ObjectUtils工具类。

针对List集合、Map集合,除了ObjectUtils还可以使用CollectionUtils工具类进行判断。

针对数组和List集合中的子元素是否都为null的判断,则需要遍历判断。

到此这篇关于Java中 !=null 的判断的文章就介绍到这了,更多相关https://blog.csdn.net/qq_37844084/article/details/144914147内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成Access DB实现数据导入和解析

    SpringBoot集成Access DB实现数据导入和解析

    microsoft office access是由微软发布的关联式数据库管理系统,它结合了 microsoft jet database engine 和 图形用户界面两项特点,是一种关系数据库工具,本文给大家介绍了SpringBoot集成Access DB实现数据导入和解析,需要的朋友可以参考下
    2024-11-11
  • Java异常日志堆栈丢失的原因与排查

    Java异常日志堆栈丢失的原因与排查

    这篇文章主要给大家介绍了关于Java异常日志堆栈丢失的原因与排查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringMVC结构简介及常用注解汇总

    SpringMVC结构简介及常用注解汇总

    这篇文章主要介绍了SpringMVC结构简介及常用注解汇总,帮助大家更好的理解和学习使用SpringMVC,感兴趣的朋友可以了解下
    2021-03-03
  • Java动态代理分析及理解

    Java动态代理分析及理解

    这篇文章主要介绍了Java动态代理分析及理解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java微信公众平台开发(9) 关键字回复以及客服接口实现

    Java微信公众平台开发(9) 关键字回复以及客服接口实现

    这篇文章主要为大家详细介绍了Java微信公众平台开发第九步,关键字回复以及客服接口实现,以及遇到该公众号暂时无法提供服务的解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • MybatisPlus代码生成器的使用方法详解

    MybatisPlus代码生成器的使用方法详解

    在这里我将展示如何自动生成实体类、控制层、服务层、mapper等代码,这些基础的代码全部不需要我们手动创建,由MybatisPlus自动帮我们完成,我们只需要告诉MybatisPlus怎么生成这些代码就可以了,在此之前我们需要配置好测试的环境,数据库和表数据 ,需要的朋友可以参考下
    2021-06-06
  • 利用Java实现复制Excel工作表功能

    利用Java实现复制Excel工作表功能

    这篇文章主要给大家介绍了关于如何利用Java实现复制Excel工作表功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • IntelliJ IDEA 2021.3永久最新激活至2099年(亲测有效)

    IntelliJ IDEA 2021.3永久最新激活至2099年(亲测有效)

    最新版idea2021.3已出来,很多网友迫不及待的要升级idea2021最新版,今天小编抽空给大家整理了一篇教程关于idea2021.3最新激活教程,本文以idea2021.2.3为例通过图文并茂的形式给大家分享激活详细过程,感兴趣的朋友参考下吧
    2020-12-12
  • kafka消费不到数据的排查过程

    kafka消费不到数据的排查过程

    这篇文章主要介绍了kafka消费不到数据的排查过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • SpringBoot+ShardingSphereJDBC实现读写分离详情

    SpringBoot+ShardingSphereJDBC实现读写分离详情

    这篇文章主要介绍了SpringBoot+ShardingSphereJDBC实现读写分离详情,通过用​​MySQL​​进行一主一从的主从复制展开全文内容,需要的朋友可以参考一下
    2022-08-08

最新评论