为什么此异常从我的Iterator搜索中输出?

时间:2019-04-10 07:58:16

标签: java exception iterator

当尝试使用Iterator搜索特定的Integer时,我收到了ConcurrentModificationException。

我不知道为什么它在那里。我研究过的任何研究都说,当我尝试在for循环中编辑列表时,这是一个例外。我没有这样做,实际上我什至没有在Iterator中编辑列表。

private ArrayList<Integer> list = new ArrayList();
private ListIterator<Integer> iterator = list.listIterator();

public void search(int input) {
    while (iterator.hasNext()) {
        if (input == iterator.next()) {
            System.out.println(iterator.next());
       }
    } 
}

public static void main(String[] args) {
    SearchList sl = new SearchList();

    for (int i = 0; i < 10; i++) {
        sl.list.add(i);
    }

    System.out.println(sl.list);

    sl.search(6);
}

预期输出:

6

实际输出:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at SearchList.search(SearchList.java:23)
    at SearchList.main(SearchList.java:38)```

2 个答案:

答案 0 :(得分:4)

创建迭代器(在初始化类实例时),然后修改基础列表。
迭代器不喜欢这样。

如Javadoc所说:

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,除非通过迭代器自己的remove或add方法,否则迭代器将抛出ConcurrentModificationException。因此,面对并发修改,迭代器会快速干净地失败,而不会在未来的不确定时间内冒着任意,不确定的行为的风险。

答案 1 :(得分:3)

这里的问题是,您在开始时创建了iterator,然后修改了列表。

解决方案:在search方法中,获取iterator并对其进行处理。