一尘不染

通过ArrayList进行反向迭代会产生IndexOutOfBoundsException

java

当我反向遍历ArrayList时,我得到了IndexOutOfBoundsException。我尝试进行正向迭代,没有问题。我期望并知道列表中包含五个元素。代码如下:

Collection rtns = absRtnMap.values();
List list = new ArrayList(rtns);
Collections.sort(list);

for(int j=list.size();j>0;j=j-1){
  System.out.println(list.get(j));
}

正向迭代-工作正常,但对我没有用:

for(int j=0;j<list.size();j++){
    System.out.println(list.isEmpty());
    System.out.println(list.get(j));
} // this worked fine

错误:

Exception in thread "Timer-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at model.Return.getReturnMap(Return.java:61)
    at controller.Poller$1.run(Poller.java:29)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

另外,如果有人知道反向迭代更好的习惯用法,我很乐意尝试一下。


阅读 222

收藏
2020-12-03

共1个答案

一尘不染

list.size() - 1由于数组(或ArrayList)元素的编号从0到小于列表大小的1进行编号,因此开始迭代。这是一个相当标准的习惯用法:

for (int j = list.size() - 1; j >= 0; j--) {
    // whatever
}

请注意,您的前向迭代有效,因为它 到达 之前 就停止了list.size()

2020-12-03