You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动