Java删除ArrayList元素时出现IndexOutOfBoundsException索引越界问题求解
问题根因
报错的核心原因是Order类中removeComputerPart方法的执行逻辑顺序错误:
// 原错误代码 public void removeComputerPart(int index){ parts.remove(index); // 第一步先删除了索引对应的元素,此时ArrayList长度减1 totalPrice-= parts.get(index).getPrice(); // 第二步再尝试读取原索引的元素,此时列表长度已经变小,索引越界 }
你要删除索引3的元素时,第一步执行完remove后,ArrayList的长度从4变成3,最大有效索引变为2,第二步再调用parts.get(3)自然触发索引越界。
修复方案
调整方法内的执行顺序:先读取待删除元素的价格扣减到总金额,再执行元素删除操作:
// 修复后代码 public void removeComputerPart(int index){ // 先获取待删除元素的价格完成扣减 totalPrice -= parts.get(index).getPrice(); // 扣减完成后再删除元素 parts.remove(index); }
额外注意事项
如果需要支持同时删除多个元素(比如输入1,3同时删两个),直接按输入的正序删除会出现索引偏移问题:比如先删了索引1,原来的索引3会变成索引2,再删原索引3的时候就会删错或者越界。建议处理方式是把所有待删除的索引先按从大到小排序,再依次执行删除操作。
内容的提问来源于stack exchange,提问作者Madhav
相关产品推荐
相关产品推荐

