一文详解Java如何优雅地判断对象是否为空

 更新时间:2024年04月28日 08:30:41   作者:孤蓬&听雨  
这篇文章主要给大家介绍了关于Java如何优雅地判断对象是否为空的相关资料,在Java中可以使用以下方法优雅地判断一个对象是否为空,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. 前言

在实际项目中,我们经常需要对各种变量或对象进行判空校验。这是因为,如果不进行判空校验,当遇到空值时,可能会导致程序出现NullPointerException异常。这是一种常见的运行时异常,它会在试图访问或操作空对象引用时发生。为了避免这种异常的出现,我们需要在使用变量或对象之前,进行仔细的判空校验,以确保它们的值是有效的,或者它们不是空值。通过进行判空校验,我们可以更好地保证程序的稳定性和可靠性,避免潜在的错误和异常。

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这是一种传统的比较方式,直接使用"!="运算符来检查一个对象是否为null。如果obj不为null,则表达式的结果为false;如果obj为null,则表达式的结果为true。

2.2 List的判空

像List这种比较特殊的在项目中可能不仅仅是判断非空了。对于List来说不等于null和List.size()不等于0是两回事,公司也有实习生常常有把这两个混淆的情况,list不等于null说明已经初始化了,堆内存中有一块属于它的地盘,而size为0说明还没往里面放东西,举个例子说就是不等于null代表我现在有个瓶子,size大于0说明我向瓶子里装水了。

来看一下源码:

public boolean isEmpty(List list) {
     if (list != null && list.size() > 0) {
         return false;
     } else {
         return true;
     }
 }

相当于判断瓶子里有没有水(前提是瓶子已经存在,若瓶子不存在,则会抛出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、大多数人使用的方法之一,直观,方便,但效率低下:

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的出现就是用来防止NullpointException的。常见的方法有:

  • .empty(): 创建一个空的Optional实例
  • .of(T t): 创建一个Optional 实例,为null时报异常
  • .ofNullable(T t): 若t 不为null,创建Optional 实例,否则创建空实例
  • isPresent(): 判断容器中是否有值
  • ifPresent(Consume lambda): 容器若不为空则执行括号中的Lambda表达式
  • orElse(T t): 获取容器中的元素,若容器为空则返回括号中的默认值
  • orElseGet(Supplier s): 如果调用对象包含值,返回该值,否则返回s 获取的值
  • orElseThrow(): 如果为空,就抛出定义的异常,如果不为空返回当前对象
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper): 与map 类似,要求返回值必须是Optional
  • T get(): 获取容器中的元素,若容器为空则抛出NoSuchElement异常

先看个常见的示例:

baseInfo类中有布尔类型的属性,是空返回false,不为空取其值,需要四行。

boolean blind = false;
if (null != baseInfo.getBlind()) {
    blind = baseInfo.getBlind();
}

当使用Optional时,一行搞定,非常的优雅。

boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse(false);

Java中的Optional 是一个可以为null的容器对象。如果值存在则isPresent()方法返回true。调用get()方法会返回该对象。

创建Optional对象的方式有三种:

  • 创建一个空的Optional对象:Optional.empty()。
  • 使用非null值创建Optional对象:Optional.of(T value)。
  • 使用任意值创建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"

以上代码中,首先创建了一个包含字符串"test"的Optional对象。然后使用isPresent()方法检查该值是否为null,使用get()方法获取该值。接下来使用ifPresent()方法检查值是否存在,如果存在则执行lambda表达式中的代码。在这个例子中,输出结果是"t"。

总结来说,Java中的Optional对象可以用于避免空指针异常的情况,它提供了一种更优雅、更简洁的方式来处理可能为空的值。

3. 总结

每种方法都有其适用的场景,链式编程也不例外。虽然它可以使代码更优雅,但可能会降低逻辑性和可读性。因此,在项目中使用时,需要根据具体情况慎重考虑。

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

相关文章

  • java实现延迟/超时/定时问题

    java实现延迟/超时/定时问题

    这篇文章主要介绍了java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Spring  AOP的两种使用方法

    Spring  AOP的两种使用方法

    这篇文章主要介绍了Spring AOP的两种使用方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java中@ConditionalOnProperty注解使用

    Java中@ConditionalOnProperty注解使用

    在Spring Boot中,@ConditionalOnProperty注解是一种方便的工具,用于根据应用程序配置文件中的属性值来控制Bean的创建和加载,本文就来介绍一下Java中@ConditionalOnProperty注解使用,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot利用Junit动态代理实现Mock方法

    SpringBoot利用Junit动态代理实现Mock方法

    说到Spring Boot 单元测试主要有两个主流集成分别是Mockito,Junit,这个各有特点,在实际开发中,我想要的测试框架应该是这个框架集成者,本文给大家介绍了SpringBoot利用Junit动态代理实现Mock方法,需要的朋友可以参考下
    2024-04-04
  • Java 获取Web项目相对webapp地址的实例

    Java 获取Web项目相对webapp地址的实例

    下面小编就为大家带来一篇Java 获取Web项目相对webapp地址的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 如何用Jfinal连接多个数据库

    如何用Jfinal连接多个数据库

    这篇文章主要介绍了如何用Jfinal连接多个数据库,帮助大家更好的理解和学习使用Jfinal,感兴趣的朋友可以了解下
    2021-03-03
  • java连接Oracle数据库的工具类

    java连接Oracle数据库的工具类

    这篇文章主要介绍了java连接Oracle数据库的工具类,非常的实用,需要的小伙伴参考下。
    2015-03-03
  • eclipse中没有SERVER的解决办法(超详细)

    eclipse中没有SERVER的解决办法(超详细)

    使用eclipse进行tomcat配置时,经常会发现一个重要的问题就是打开eclipse之后没有了server选项,所以本给大家详细介绍了eclipse中没有SERVER的解决办法,文中有详细的图文讲解,需要的朋友可以参考下
    2023-12-12
  • Spring Boot读取resources目录文件方法详解

    Spring Boot读取resources目录文件方法详解

    这篇文章主要介绍了Spring Boot读取resources目录文件方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • maven创建spark项目的pom.xml文件配置demo

    maven创建spark项目的pom.xml文件配置demo

    这篇文章主要为大家介绍了maven创建spark项目的pom.xml文件配置demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论