IndexOutOfBoundsException

IndexOutOfBoundsException

我的程序不断出现随机java.lang.IndexOutOfBoundsException错误。
我究竟做错了什么?
该程序运行良好,它的for循环确实很长,但是对于某些元素,我似乎遇到了该错误,然后继续进行下一个元素,它可以正常工作。

for (int i = 0; i < response.getSegments().getSegmentInfo().size()-1; i++) {
   reservedSeats = response.getSegments().getSegmentInfo().get(i).getCabinSummary().getCabinClass().get(i).getAmountOfResSeat();
   usedSeats = response.getSegments().getSegmentInfo().get(i).getCabinSummary().getCabinClass().get(i).getAmountOfUsedSeat();
   System.out.println("Reserved Seats: " + reservedSeats);
   System.out.println("Used Seats    : " + usedSeats);
}


我该如何防止此错误?

最佳答案

对于那些认为这是一个数组的人,它更可能是一个列表。

让我猜想,您曾经获得ConcurrentModificationExceptions,所以您重写了循环以使用元素的索引查找(避免使用迭代器)。恭喜,您已修复异常,但未解决问题。

您正在此循环运行时更改列表。您不时地删除一个元素。时不时地查看最后一个元素size()-1。当操作顺序如下:

 (some thread)
 remove an element from response.getSegments().getSegmentInfo()
 (some possibly other thread)
 lookup up the size()-1 element of the above


您访问不再存在的元素,这将引发IndexOutOfBoundsException。

您需要通过控制对该列表的访问来修复此列表周围的逻辑,以便在需要检查所有元素时,不要认为该列表与所有元素都相同,或者(更好的解决方案)冻结列表。循环列表。

后者的一种简单方法是制作List的副本(而不是List的元素)并遍历该副本。

---编写完上述内容后,由于问题在编辑中发生了巨大变化,因此进行编辑---

您添加了很多额外的代码,包括一些额外的列表查找。您正在对所有列表查找使用相同的索引,但是没有任何迹象表明所有列表的大小均相同。

另外,您可能不想跳过所有元素,很可能您真的想访问segmentInfo中的所有机舱类,而不仅仅是访问3rd segmentInfo中的第3 CabClass,等等。

10-07 12:42