上一篇
Java怎么正确做非空判断?避免空指针
- 后端开发
- 2025-06-21
- 3417
Java非空判断主要使用条件语句检查对象是否为null,基本写法:
if (obj != null) {...}
,对于字符串需额外检查空串:
if (str != null && !str.isEmpty())
,Java 8+推荐用Optional类优雅处理空值。
在Java开发中,非空判断是避免NullPointerException
(空指针异常)的核心技巧,以下是详细实践指南,覆盖不同场景的解决方案:
基础判断方法
-
== 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("集合为空或没有元素"); }
-
字符串空值检测
使用isEmpty()
或isBlank()
(Java 11+):String str = ""; if (str == null || str.isEmpty()) { System.out.println("字符串为空"); } // Java 11+ 支持(检测空格) if (str == null || str.isBlank()) { System.out.println("字符串为空或仅包含空格"); }
工具库简化判断
-
Apache Commons Lang
StringUtils
和CollectionUtils
提供更安全的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或没有元素"); }
-
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+ 高级方案
-
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");
-
Objects工具类
使用java.util.Objects
简化校验:import java.util.Objects; // 非空校验(抛出NullPointerException) Objects.requireNonNull(obj, "对象不能为null"); // 安全比较 boolean isEqual = Objects.equals(str1, str2); // 避免空指针
实战场景示例
-
方法参数校验
在方法入口处防御性检查:public void processData(List<String> data) { if (CollectionUtils.isEmpty(data)) { throw new IllegalArgumentException("数据列表不能为空"); } // 业务逻辑... }
-
深度属性访问
使用Optional
避免多层嵌套判空:String cityName = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("默认城市");
最佳实践建议
-
优先使用工具类
StringUtils
、CollectionUtils
等减少重复代码,提升可读性。 -
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内置,轻量级 |
引用说明:
- Oracle官方文档 Java Optional
- Apache Commons Lang StringUtils
- Spring Framework ObjectUtils
通过合理选择策略,可彻底避免空指针异常,提升代码健壮性,建议根据项目依赖和复杂度混合使用上述方案。