如何解决Java Sap Hybris中出现的NoSuchElement: null报错问题
错误根因
java.util.NoSuchElementException 是调用空集合的迭代器next()方法导致,你第37行的链式调用存在2处未校验的空集合风险,同时代码本身未适配多选订单的业务需求:
- 未校验选中的订单集合
hashSet是否为空,若用户未选中任何订单直接点击按钮,第一个hashSet.iterator().next()直接抛出异常 - 未校验单个订单关联的流程集合
getOrderProcess()是否为空,若选中的订单没有绑定对应的业务流程实例,第二个iterator().next()会抛出异常 - 现有逻辑仅会处理选中的第一个订单,即使选了多个订单也不会批量触发状态修改,不符合需求要求
修复方案
- 新增非空校验,分别校验选中订单集合、单个订单的流程集合是否为空
- 新增循环逻辑,批量处理所有选中的符合条件的订单
- 异常处理细化,避免单个订单处理失败导致整批操作终止
注意:如果你的业务场景中一个订单可能关联多个业务流程,不要直接调用
iterator().next()取第一个流程,需要增加逻辑筛选出你需要触发事件的对应流程实例。
修正后代码参考
@Resource(name = "businessProcessService") private BusinessProcessService businessProcessService; @Override public ActionResult<Object> perform(ActionContext<Object> actionContext){ HashSet<OrderModel> hashSet = (HashSet<OrderModel>) actionContext.getData(); // 校验选中订单集合非空 if (hashSet == null || hashSet.isEmpty()) { Messagebox.show("请先选择需要导出的订单"); return new ActionResult<>(ActionResult.ERROR); } int successCount = 0; try { for (OrderModel order : hashSet) { // 校验订单关联流程非空 if (order.getOrderProcess() == null || order.getOrderProcess().isEmpty()) { LOG.warn("订单{}未关联业务流程,跳过导出处理", order.getCode()); continue; } // 触发流程事件 String eventCode = order.getOrderProcess().iterator().next().getCode() + "_SaitManualExportEvent"; businessProcessService.triggerEvent(eventCode); successCount++; } Messagebox.show(String.format("导出操作执行完成,成功处理%s个订单", successCount)); return new ActionResult<>(ActionResult.SUCCESS); } catch (final Exception ex) { LOG.error("手动导出订单操作失败: ", ex); Messagebox.show("操作失败,请联系管理员查看后台日志"); return new ActionResult<>(ActionResult.ERROR); } }
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

