obj == null
;字符串用str == null || str.isEmpty()
(注意空串);集合类用collection == null || collection.isEmpty()
,Java 8+推荐Objects.isNull(obj)
,第三方库如Apache Commons提供StringUtils.isEmpty()
等工具方法,注意避免直接对null对象操作引发空指针异常。在Java开发中,空指针异常(NullPointerException
)是最常见的运行时错误之一,正确处理空值(null
)不仅能提升代码健壮性,还能避免程序崩溃,以下是Java中空判断的详细指南,涵盖核心方法、场景示例及最佳实践。
什么是空(null)?
null
表示对象引用未指向任何内存地址。- 基本数据类型(如
int
,double
)不能为null
,但包装类(如Integer
,Double
)可以。 - 未初始化的对象引用默认值为
null
。
基础空判断方法
使用 或 运算符
Object obj = null; if (obj == null) { System.out.println("对象为空"); } if (obj != null) { System.out.println("对象非空"); }
字符串空判断
需同时检查 null
和空字符串:
String str = null; if (str == null || str.isEmpty()) { // 避免调用isEmpty()时抛NPE System.out.println("字符串为空或null"); } // Apache Commons Lang 简化判断 if (StringUtils.isEmpty(str)) { // 同时检查null和空字符串 System.out.println("字符串无效"); }
集合空判断
集合需检查 null
和空集合:
List<String> list = null; if (list == null || list.isEmpty()) { System.out.println("集合为空或null"); } // 使用工具类(如Spring Framework) if (CollectionUtils.isEmpty(list)) { System.out.println("集合无效"); }
数组空判断
String[] array = null; if (array == null || array.length == 0) { System.out.println("数组为空或null"); }
进阶空值处理
Optional
类(Java 8+)
避免显式 null
检查,强制调用方处理空值:
Optional<String> optional = Optional.ofNullable(getNullableString()); // 存在值时执行操作 optional.ifPresent(value -> System.out.println(value)); // 空时返回默认值 String result = optional.orElse("default"); // 空时抛出异常 String value = optional.orElseThrow(() -> new IllegalArgumentException("值不能为空"));
Objects
工具类(Java 7+)
简化判空和空值处理:
// 空值检查 Objects.requireNonNull(obj, "对象不能为null"); // 安全比较 if (Objects.equals(str1, str2)) { // 避免NPE System.out.println("内容相同"); }
场景化解决方案
-
方法参数校验
public void process(User user) { if (user == null) { throw new IllegalArgumentException("User对象不能为空"); } // 业务逻辑 }
-
链式调用安全
// 传统方式(易抛NPE) String city = user.getAddress().getCity(); // 安全写法 String city = null; if (user != null && user.getAddress() != null) { city = user.getAddress().getCity(); } // 使用Optional String city = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("未知");
-
返回值的空处理
// 返回空集合而非null(避免调用方判空) public List<String> getData() { return new ArrayList<>(); // 而非返回null }
最佳实践与常见陷阱
-
最佳实践
- 始终在方法入口校验参数是否为
null
。 - 优先返回空集合(如
Collections.emptyList()
)而非null
。 - 使用
Optional
明确表示可能为空的返回值。 - 借助 Lombok 的
@NonNull
注解自动生成空检查代码。
- 始终在方法入口校验参数是否为
-
常见陷阱
- 陷阱1:未检查方法返回值是否为
null
。String[] data = getData(); // 可能返回null int length = data.length; // 抛NPE
- 陷阱2:过度使用
Optional
导致性能下降(适合返回值,不推荐用于字段或参数)。 - 陷阱3:忽略日志中的空值(
logger.debug("Value: {}", obj.toString())
可能抛NPE)。
- 陷阱1:未检查方法返回值是否为
- 基础场景:用
== null
或!= null
直接判断。 - 字符串/集合:结合
null
和isEmpty()
检查。 - 复杂逻辑:优先使用
Optional
或Objects
工具类。 - 设计原则:避免传递
null
,采用“空对象模式”或返回默认空结构。
通过严格的空值管理,可显著减少 NullPointerException
,提升代码可读性和可靠性,始终遵循“防御性编程”原则,将空判断视为基础开发习惯。
引用说明:
- Oracle官方文档:Java SE 11 Optional
- Google Java风格指南:空值处理建议
- 《Effective Java》第三版(Joshua Bloch):条目55“返回Optional而非null”
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/26237.html