站点与账户表账号不匹配报错实现及空指针异常排查求助
解决siteNumberValidator中Collectors.groupingBy抛出的NullPointerException
核心原因分析
这行代码抛出NullPointerException,大概率是以下两种情况之一:
sitios集合本身为null,调用stream()方法时触发空指针sitios集合中存在null的SiteInformation对象,调用getAccountNumber()方法时触发空指针
针对性解决方法
1. 先校验集合本身是否为空
确保sitios被正确初始化,避免直接对null集合调用stream():
// 先判断集合是否为null或空 if (sitios == null || sitios.isEmpty()) { // 根据业务需求处理:返回空map,或者抛出明确的业务异常 return Collections.emptyMap(); } // 再执行分组逻辑 Map<String, List<SiteInformation>> siteGroups = sitios.stream() .collect(Collectors.groupingBy(SiteInformation::getAccountNumber));
2. 过滤集合中的null元素
如果sitios里混入了null的SiteInformation实例,先过滤再分组:
Map<String, List<SiteInformation>> siteGroups = sitios.stream() .filter(Objects::nonNull) // 剔除null的SiteInformation对象 .collect(Collectors.groupingBy(SiteInformation::getAccountNumber));
3. 结合业务场景优化(可选)
结合你需要校验站点账号与账户表匹配的业务,还可以进一步过滤掉账号为null的站点,后续将这些站点标记为未匹配,对应前端的错误提示:
// 先过滤无效数据 List<SiteInformation> validSites = sitios.stream() .filter(Objects::nonNull) .filter(site -> site.getAccountNumber() != null) .collect(Collectors.toList()); // 处理无效站点(账号为null或对象为null的) List<SiteInformation> invalidSites = sitios.stream() .filter(site -> site == null || site.getAccountNumber() == null) .collect(Collectors.toList()); // 这里可以给invalidSites标记错误状态,返回给前端显示"No matching Account in Account tab found - unmapped" // 正常分组逻辑 Map<String, List<SiteInformation>> siteGroups = validSites.stream() .collect(Collectors.groupingBy(SiteInformation::getAccountNumber));
内容的提问来源于stack exchange,提问作者xxcbox
相关产品推荐
相关产品推荐

