我的程序不断出现随机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,等等。