向ArrayList集合添加元素时触发IndexOutOfBoundsException异常求助
ArrayList插入元素时IndexOutOfBoundsException问题排查
问题原因
你调用的indixlist.add(berth_idx, agent.shipindex)是ArrayList的指定索引插入方法,这个方法要求传入的索引必须满足 0 ≤ index ≤ 当前集合size。当你的集合size为2、berth_idx为3时,3>2,违反了该约束,因此触发IndexOutOfBoundsException。
你混淆了ArrayList的两种扩容逻辑:
- 不带索引的
add(E e)方法会在集合末尾添加元素,当容量不足时自动扩容; - 带索引的
add(int index, E element)仅负责在指定位置插入元素,不会自动填充索引与当前size之间的空位,也不会因为索引超出size而自动扩容。
解决方案
根据你跟踪泊位占用状态的业务需求,推荐以下两种处理方式:
方式一:填充空位后设置指定索引的值
如果需要直接将船舶索引对应到泊位索引的位置(中间空位用默认值标记未占用),先将集合扩容到目标索引+1的大小,再用set方法替换对应位置的值:
berth_idx = permNAtt.size()-1; // 填充空位,确保集合大小足够容纳目标索引 while(indixlist.size() <= berth_idx){ indixlist.add(-1); // 用-1表示泊位未被占用,可根据实际业务调整默认值 } // 替换指定泊位索引的船舶编号 indixlist.set(berth_idx, agent.shipindex);
方式二:直接添加到集合末尾(无需指定索引)
如果不需要严格对应泊位索引与集合索引的位置关系,仅需记录已占用泊位对应的船舶,直接使用无参add方法:
indixlist.add(agent.shipindex);
内容的提问来源于stack exchange,提问作者Green Madam
相关产品推荐
相关产品推荐

