当尝试使用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)```
答案 0 :(得分:4)
创建迭代器(在初始化类实例时),然后修改基础列表。
迭代器不喜欢这样。
如Javadoc所说:
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间以任何方式对列表进行结构修改,除非通过迭代器自己的remove或add方法,否则迭代器将抛出ConcurrentModificationException。因此,面对并发修改,迭代器会快速干净地失败,而不会在未来的不确定时间内冒着任意,不确定的行为的风险。
答案 1 :(得分:3)
这里的问题是,您在开始时创建了iterator
,然后修改了列表。
解决方案:在search
方法中,获取iterator
并对其进行处理。