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

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

    StringUtils和CollectionUtils提供更安全的API:

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

    // 添加依赖: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

    内置ObjectUtils和StringUtils:

    // 依赖: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简化校验:

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

    实战场景示例

    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. 优先使用工具类

      StringUtils、CollectionUtils等减少重复代码,提升可读性。

    2. Optional使用原则

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

        方法返回集合时,返回空集合(如Collections.emptyList())而非null。

      • 注解辅助

        结合@NonNull(Lombok/JSR 305)在编译期预警:

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

        引用说明

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

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

0