Spring Boot中如何按条件过滤返回列表并避免空指针异常
问题核心原因
原代码存在两处严重错误:
- 空值校验完全缺失:
product对象、product.name、datas字段任意为null时都会触发空指针异常,也就是你遇到的Cannot invoke "String.equals(Object)" because "datas" is null报错 - 循环逻辑完全错误:循环内调用
addAll(itemCollection)会重复添加整个列表的元素,且循环过程中调用remove(i)会导致索引偏移,漏掉后续元素的判断
修改后的实现代码
提供两种写法,你可以根据项目Java版本选择:
方案1:常规循环写法(兼容Java 7及更早版本)
@Override public List<Item> getcollectionfromapi(List<String> itemids) throws Exception { List<Item> itemCollection = itemRepository.findById(itemids); List<Item> resultList = new ArrayList<>(); for (Item item : itemCollection) { // 逐层校验空值,避免空指针 if (item.getProduct() == null) { continue; } String name = item.getProduct().getName(); String datas = item.getData(); // 两个条件同时满足才加入结果集:name非空、datas不区分大小写等于data if (name != null && name.length() > 0 && "data".equalsIgnoreCase(datas)) { resultList.add(item); } } return resultList; }
方案2:Stream流式写法(Java 8+推荐,代码更简洁)
@Override public List<Item> getcollectionfromapi(List<String> itemids) throws Exception { return itemRepository.findById(itemids) .stream() // 过滤product不为null的对象 .filter(item -> item.getProduct() != null) // 过滤product.name非空的对象 .filter(item -> item.getProduct().getName() != null && item.getProduct().getName().length() > 0) // 过滤datas不区分大小写等于data的对象,常量在前避免空指针 .filter(item -> "data".equalsIgnoreCase(item.getData())) // Java 16+直接用toList(),Java 8-15版本替换为.collect(Collectors.toList())即可 .toList(); }
关键修改点说明
- 所有可能为null的字段都提前做了非空判断,避免空指针异常
- 用
"data".equalsIgnoreCase(datas)替代datas.equals("Data"):常量在前调用方法,就算datas为null也只会返回false,不会抛出空指针 - 去掉了原逻辑中错误的
addAll和remove操作,仅将符合条件的单个元素加入结果集,不会出现重复添加、漏判的问题
内容的提问来源于stack exchange,提问作者welcome_java
相关产品推荐
相关产品推荐

