当前位置:首页 > 后端开发 > 正文

Java怎么正确做非空判断?避免空指针

Java非空判断主要使用条件语句检查对象是否为null,基本写法: if (obj != null) {...},对于字符串需额外检查空串: if (str != null && !str.isEmpty()),Java 8+推荐用Optional类优雅处理空值。

在Java开发中,非空判断是避免NullPointerException(空指针异常)的核心技巧,以下是详细实践指南,覆盖不同场景的解决方案:


基础判断方法

  1. == null 判断
    最直接的方式,适用于对象、数组、集合:

    // 对象判断
    if (obj == null) {
        System.out.println("对象为空");
    }
    // 数组判断(需先判空再检查长度)
    String[] array = null;
    if (array == null || array.length == 0) {
        System.out.println("数组为空或长度为0");
    }
    // 集合判断(推荐使用CollectionUtils.isEmpty())
    List<String> list = null;
    if (list == null || list.isEmpty()) {
        System.out.println("集合为空或没有元素");
    }
  2. 字符串空值检测
    使用isEmpty()isBlank()(Java 11+):

    String str = "";
    if (str == null || str.isEmpty()) {
        System.out.println("字符串为空"); 
    }
    // Java 11+ 支持(检测空格)
    if (str == null || str.isBlank()) {
        System.out.println("字符串为空或仅包含空格");
    }

工具库简化判断

  1. Apache Commons Lang
    StringUtilsCollectionUtils提供更安全的API:

    // 添加依赖:org.apache.commons:commons-lang3
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.collections4.CollectionUtils;
    // 字符串检测(自动处理null)
    if (StringUtils.isEmpty(str)) {
        System.out.println("字符串为null或空字符串");
    }
    // 集合检测
    List<String> dataList = null;
    if (CollectionUtils.isEmpty(dataList)) {
        System.out.println("集合为null或没有元素");
    }
  2. Spring Framework
    内置ObjectUtilsStringUtils

    Java怎么正确做非空判断?避免空指针  第1张

    // 依赖:org.springframework:spring-core
    import org.springframework.util.ObjectUtils;
    import org.springframework.util.StringUtils;
    // 对象非空检测
    if (ObjectUtils.isEmpty(obj)) {
        System.out.println("对象为null或空");
    }
    // 字符串检测(支持空格判断)
    if (!StringUtils.hasText(str)) {
        System.out.println("字符串为null/空/仅空格");
    }

Java 8+ 高级方案

  1. Optional 优雅处理
    消除显式null检查,避免嵌套if:

    import java.util.Optional;
    // 创建Optional对象
    Optional<String> optional = Optional.ofNullable(variable);
    // 存在时执行操作
    optional.ifPresent(value -> System.out.println("值存在: " + value));
    // 空值替代方案
    String result = optional.orElse("default");
    // 链式操作示例
    String safeValue = Optional.ofNullable(user)
         .map(User::getName)
         .map(String::toUpperCase)
         .orElse("UNKNOWN");
  2. Objects工具类
    使用java.util.Objects简化校验:

    import java.util.Objects;
    // 非空校验(抛出NullPointerException)
    Objects.requireNonNull(obj, "对象不能为null");
    // 安全比较
    boolean isEqual = Objects.equals(str1, str2); // 避免空指针

实战场景示例

  1. 方法参数校验
    在方法入口处防御性检查:

    public void processData(List<String> data) {
        if (CollectionUtils.isEmpty(data)) {
            throw new IllegalArgumentException("数据列表不能为空");
        }
        // 业务逻辑...
    }
  2. 深度属性访问
    使用Optional避免多层嵌套判空:

    String cityName = Optional.ofNullable(user)
         .map(User::getAddress)
         .map(Address::getCity)
         .orElse("默认城市");

最佳实践建议

  1. 优先使用工具类
    StringUtilsCollectionUtils等减少重复代码,提升可读性。

  2. Optional使用原则

    • 适用于返回值,不推荐作为字段或方法参数
    • 避免Optional.get()(用orElse()替代)
  3. 空集合优于null
    方法返回集合时,返回空集合(如Collections.emptyList())而非null。

  4. 注解辅助
    结合@NonNull(Lombok/JSR 305)在编译期预警:

    public void updateUser(@NonNull User user) {
        // 自动生成非空检查代码
    }

方案 适用场景 优点
obj == null 简单对象检查 无需依赖库
StringUtils 字符串/集合操作 安全处理边界条件
Optional 链式调用、深度属性访问 代码优雅,减少嵌套if
Objects 参数校验、安全比较 JDK内置,轻量级

引用说明

  • Oracle官方文档 Java Optional
  • Apache Commons Lang StringUtils
  • Spring Framework ObjectUtils

通过合理选择策略,可彻底避免空指针异常,提升代码健壮性,建议根据项目依赖和复杂度混合使用上述方案。

0