Karate拆分API响应动态数组为两个数组奇数长度报错如何解决
问题根因
当大数组长度为奇数时,循环到最后一轮的i值等于数组长度-1,此时i+1已经超出数组的合法索引范围(数组索引从0开始,最大值为长度-1)。你原逻辑没有先判断i+1是否存在,直接尝试访问result.response.value[i+1].user.id就会触发数组越界错误。
你本地测试简单数组没报错,是因为原生JS中普通数组访问不存在的索引会返回undefined,undefined>0判断结果为false,不会抛出异常;但Karate封装的Java List对象访问不存在的索引会直接抛出越界异常,二者行为存在差异,这就是本地测试正常但实际运行报错的原因。
修复方案
在访问i+1位置的元素前,先判断i+1是否小于数组长度,修改后的代码如下:
config.Ids = [] config.Ids1 = [] const valueList = result.response.value const arrLength = valueList.length console.log("length of big array-------------" + arrLength) for (var i=0; i < arrLength; i+=2) { config.Ids.push(valueList[i].user.id); // 新增i+1合法性判断 if (i + 1 < arrLength && valueList[i+1].user.id > 0) { config.Ids1.push(valueList[i+1].user.id); } console.log("value of i-------" + i); }
额外优化建议
如果担心返回的元素里可能没有user或者id字段,可以再加一层属性存在性判断,避免空指针异常:
if (i + 1 < arrLength && valueList[i+1]?.user?.id > 0) { config.Ids1.push(valueList[i+1].user.id); }
内容的提问来源于stack exchange,提问作者Maddy
相关产品推荐
相关产品推荐

