SpringBoot封装Response返回值时出现数组下标越界错误如何解决?
错误根因
- 变量引用错误:代码中查询得到的商品集合变量名为
itemCollection,但给data赋值的代码行错误引用了不存在的item变量,属于基础拼写错误。 - 嵌套列表索引越界:
getProd()返回的是当前商品下关联的产品列表,你直接复用外层循环的索引i来取产品列表的第i个元素,当产品列表为空、或长度小于等于i时,就会触发提示中的索引越界报错。 - Response实例逻辑错误:你把
Response对象的实例化放在了for循环外部,整个循环过程中只会修改同一个对象的属性,最终返回的列表中所有元素都会是最后一次循环的赋值结果,属于严重逻辑漏洞。
修复方案
首先需要确认你需要返回的data字段取值规则:如果是取当前商品下第一个产品的描述,按以下代码修复即可;如果需要返回当前商品下所有产品的描述列表,可对应调整嵌套列表的取值逻辑。
修复后参考代码:
public List<Response> getcollectionfromapi(List<String> itemids) throws Exception { List<Item> itemCollection = itemRepository.findById(itemids); Predicate<Item> nullcase = item -> item.getProduct().getName() == null; itemCollection.removeIf(nullcase); ArrayList<Response> arrayList = new ArrayList<>(); for (int i = 0; i < itemCollection.size(); i++) { // 每次循环新建独立的Response实例 Response response = new Response(); Item currentItem = itemCollection.get(i); response.set_id(currentItem.get_id()); response.setName(currentItem.getName()); // 嵌套列表先判空再取值,避免索引越界 List<Prod> prodList = currentItem.getProd(); if (prodList != null && !prodList.isEmpty()) { // 取第一个产品的描述,如需全量描述可遍历prodList收集为列表后赋值 response.setData(prodList.get(0).getDescription()); } else { // 产品列表为空时赋值默认值,可根据业务需求调整 response.setData(""); } arrayList.add(response); } return arrayList; }
内容的提问来源于stack exchange,提问作者welcome_java
相关产品推荐
相关产品推荐

