Java判断null的几种方式及适用场景分析

 更新时间:2025年05月12日 09:18:40   作者:数据库那些事儿  
在 Java 中,判断对象是否为 null 是编程中最常见的操作之一,以下是几种主要的判断方式及其适用场景,感兴趣的朋友一起看看吧

在 Java 中,判断对象是否为 null 是编程中最常见的操作之一。以下是几种主要的判断方式及其适用场景:

一、直接使用 == null(最基础)

if (obj == null) {
    // 对象为 null 的处理逻辑
}
  • 优点:简单直接,性能最优(无额外方法调用)。
  • 缺点:需要手动处理每个对象,代码冗余。
  • 适用场景:任何场景,尤其是性能敏感的代码。

二、Objects.isNull ()(JDK 8+)

import java.util.Objects;
if (Objects.isNull(obj)) {
    // 对象为 null 的处理逻辑
}
  • 优点:语义清晰,Null 安全(传入 null 不会 NPE)。
  • 缺点:本质是对 == null 的封装,性能略低于直接判断。
  • 适用场景:代码可读性要求高,避免空指针风险。

三、Objects.nonNull ()(JDK 8+)

if (Objects.nonNull(obj)) {
    // 对象不为 null 的处理逻辑
}
  • 优点:与 Objects.isNull() 配对,语义明确。
  • 适用场景:与 Stream、Optional 等结合使用。

四、Optional 类(JDK 8+)

import java.util.Optional;
Optional<String> optional = Optional.ofNullable(obj);
if (optional.isPresent()) {
    // 对象不为 null 的处理逻辑
} else {
    // 对象为 null 的处理逻辑
}
// 更优雅的用法(避免 if-else)
optional.ifPresent(value -> System.out.println(value));
  • 优点:强制开发者处理 null 情况,避免 NPE;支持链式操作。
  • 缺点:代码略显繁琐,适合复杂流程处理。
  • 适用场景:处理可能缺失值的函数式编程,避免深层嵌套的 null 检查。

五、Apache Commons Lang(第三方库)

import org.apache.commons.lang3.ObjectUtils;
if (ObjectUtils.isEmpty(obj)) {
    // 对象为 null 或空(适用于字符串、集合等)
}
if (ObjectUtils.isNotEmpty(obj)) {
    // 对象不为 null 且非空
}
  • 优点:提供更丰富的空值判断(如空字符串、空集合)。
  • 缺点:需引入依赖。
  • 适用场景:需要统一处理多种类型空值的场景。

六、StringUtils(Apache Commons Lang)

专门用于字符串的空值判断:

import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
    // 字符串为 null、空字符串或仅含空格
}
if (StringUtils.isEmpty(str)) {
    // 字符串为 null 或空字符串(不检查空格)
}
  • 优点:处理字符串时更全面,避免 str.length() == 0 的 NPE 风险。
  • 适用场景:字符串处理场景。

七、三元运算符(简化赋值)

// 对象为 null 时赋默认值
String result = (obj == null) ? "default" : obj;
// 等价于
String result;
if (obj == null) {
    result = "default";
} else {
    result = obj;
}
  • 优点:代码简洁,适合简单赋值场景。
  • 缺点:逻辑复杂时可读性下降。

八、使用断言(开发阶段)

import static org.junit.Assert.assertNotNull;
// 在测试或开发阶段强制要求对象非空
assertNotNull(obj, "对象不能为 null");
  • 优点:快速定位问题,避免错误数据流入后续流程。
  • 缺点:断言默认在生产环境禁用,不可用于业务逻辑判断。
  • 适用场景:单元测试、方法参数校验。

性能对比

方式性能(相对)
== null最快
Objects.isNull()接近 ==
Optional较慢(涉及对象创建)

最佳实践

  • 优先使用 == null:简单场景直接判断,性能最优。
  • 复杂流程用 Optional:避免深层嵌套的 null 检查,提高代码可读性。
  • 字符串处理用 StringUtils:避免 str.isEmpty() 的 NPE 风险。
  • 集合 / 数组用 CollectionUtils.isEmpty():统一处理多种类型的空值。
  • 避免过度使用 Optional:简单场景直接判断更清晰,滥用会导致代码冗余。

示例对比

传统方式

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);

根据场景选择合适的判断方式,既能保证代码健壮性,又能提升可读性。

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

相关文章

  • java 远程文件url如何转为输入流

    java 远程文件url如何转为输入流

    这篇文章主要介绍了java 远程文件url如何转为输入流方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Maven部署报错 “Cannot deploy artifacts when Maven is in offline mode”的解决方法

    Maven部署报错 “Cannot deploy artifacts when&

    在日常Java开发中,Maven作为事实上的标准构建工具,承担着依赖管理、项目构建、测试执行、构件部署等核心职责,然而,即便是经验丰富的开发者,也常常被这样一个错误卡住Cannot deploy artifacts when Maven is in offline mode,本文介绍了解决方案,需要的朋友可以参考下
    2025-11-11
  • springboot相关面试题汇总详解

    springboot相关面试题汇总详解

    这篇文章主要介绍了springboot相关面试题汇总详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java关键字之instanceof详解

    Java关键字之instanceof详解

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据
    2021-11-11
  • java常见的字符串操作和日期操作汇总

    java常见的字符串操作和日期操作汇总

    本文主要对java 常见的字符串操作和日期操作进行整理。具有一定的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • 部署springboot项目到云服务器的两种方式(jar+war)

    部署springboot项目到云服务器的两种方式(jar+war)

    本文主要介绍了部署springboot项目到云服务器的两种方式,主要介绍了jar和war两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Mybatis的类型转换接口TypeHandler

    Mybatis的类型转换接口TypeHandler

    这篇文章主要介绍了Mybatis的类型转换接口TypeHandler,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • 教你用java stream对集合中的对象按指定字段进行分组并统计

    教你用java stream对集合中的对象按指定字段进行分组并统计

    这篇文章主要给大家介绍了关于用java stream对集合中的对象按指定字段进行分组并统计的相关资料,本文主要介绍了如何利用Java的Stream流来实现在list集合中,对具有相同name属性的对象进行汇总计算的需求,需要的朋友可以参考下
    2024-10-10
  • 用Java程序判断是否是闰年的简单实例

    用Java程序判断是否是闰年的简单实例

    下面小编就为大家带来一篇用Java程序判断是否是闰年的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java实现序列化与反序列化的简单示例

    Java实现序列化与反序列化的简单示例

    序列化与反序列化是指Java对象与字节序列的相互转换,一般在保存或传输字节序列的时候会用到,下面有两个Java实现序列化与反序列化的简单示例,不过还是先来看看序列和反序列化的具体概念:
    2016-05-05

最新评论