Lambda空指针异常:集合过滤排序代码报错技术问询
空指针异常原因排查
咱们来一步步拆解你的代码里可能触发NPE的地方:
- 应用对象本身为null:如果
apps集合里存在null的Tls201Appln实例,调用x.getTls203ApplnAbstr()时直接会抛出空指针。 - 摘要对象为空:
x.getTls203ApplnAbstr()返回null,此时继续调用getApplnAbstractLg()必然触发NPE。 - 摘要语言字段为空:即使
Tls203ApplnAbstr对象存在,getApplnAbstractLg()返回null,调用toLowerCase()时会抛出空指针。 - 申请日期为空:排序逻辑里,
x1.getApplnFilingDate()或x2.getApplnFilingDate()返回null时,调用after()或before()方法会直接触发NPE。
修复后的代码及说明
我给你调整了代码,补上所有null检查的逻辑,同时优化了部分写法:
import java.util.Objects; import java.util.Date; import java.util.stream.Collectors; // ... 你的其他代码 List<Tls201Appln> appsFiltered = apps.stream() // 第一步:过滤掉集合中的null应用对象 .filter(Objects::nonNull) // 第二步:过滤摘要存在且语言为英文的记录 .filter(x -> { Tls203ApplnAbstr abstractObj = x.getTls203ApplnAbstr(); // 先判断摘要对象不为null,再用equalsIgnoreCase忽略大小写匹配英文 return abstractObj != null && "en".equalsIgnoreCase(abstractObj.getApplnAbstractLg()); }) // 第三步:安全排序,处理日期为null的情况 .sorted((x1, x2) -> { Date date1 = x1.getApplnFilingDate(); Date date2 = x2.getApplnFilingDate(); // 处理两个日期都为null的情况 if (date1 == null && date2 == null) { return 0; } // 把null日期放在结果的最前面(如果想放最后面,把-1换成1即可) if (date1 == null) { return -1; } if (date2 == null) { return 1; } // 正常日期比较,用Date自带的compareTo更简洁 return date1.compareTo(date2); }) .collect(Collectors.toList());
关键优化点说明:
- 新增
filter(Objects::nonNull):从源头避免处理null的应用实例。 - 摘要过滤逻辑:先判断摘要对象是否存在,再用
equalsIgnoreCase替代toLowerCase().equals(),既避免了语言字段为null的问题,还能兼容大小写不一致的情况(比如"EN"也能匹配)。 - 排序逻辑:显式处理日期为null的场景,避免调用
after()/before()时的NPE,同时用Date.compareTo()简化了原有的三目判断逻辑。
内容的提问来源于stack exchange,提问作者burbak




