Java:使用foreach循环迭代时并发修改异常

Java:使用foreach循环迭代时并发修改异常,java,concurrentmodification,Java,Concurrentmodification,我知道,当您使用forech循环迭代arraylist,然后尝试从中删除对象时,会引发并发修改异常。 我有下面的代码,每当我试图删除列表中的任何对象时,都会产生此异常……对象“D”除外。 每当我试图删除此对象时,都不会引发异常。 有人能告诉我为什么没有例外吗? 这是我的代码: List myList=new ArrayList(); myList.添加(“A”); myList.添加(“B”); myList.添加(“C”); myList.添加(“D”); myList.添加(“E”); fo

我知道,当您使用forech循环迭代arraylist,然后尝试从中删除对象时,会引发并发修改异常。 我有下面的代码,每当我试图删除列表中的任何对象时,都会产生此异常……对象“D”除外。 每当我试图删除此对象时,都不会引发异常。 有人能告诉我为什么没有例外吗? 这是我的代码:

List myList=new ArrayList();
myList.添加(“A”);
myList.添加(“B”);
myList.添加(“C”);
myList.添加(“D”);
myList.添加(“E”);
for(字符串s:myList){
如果(s.等于(“D”)){
myList.remove(“D”);
}
}
System.out.println(myList);

ArrayList
文档:

这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。Fail fast迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖此异常的程序是错误的:迭代器的Fail fast行为应仅用于检测错误


ArrayList
上的
Iterator
实现尝试在可以轻松检测到它时抛出
concurrentdimption
。在这种特殊情况下,这很难,因为
hasNext()
只返回false,因此不会在迭代器上调用其他方法。

可能是因为它是列表中的最后一项,但CME有点邪恶,实际上只是“尽力而为”。还有其他边缘情况也表明CME“缺失”。@DaveNewton同意,但要删除的项目是
“D”
,它不是最后一个元素(尽管其位置在删除后成为最后一个元素)。这是否回答了您的问题@波西米亚的哎呀。这肯定是一个跨版本多次出现的“bug:)这是因为您正在修改迭代的列表,所以它会打乱循环,因为它以前所在的元素不再存在,并且列表的大小比以前小。如果使用for,在迭代任何列表/映射时尝试修改该列表/映射,您将看到这一点loop@Bohemian是吗<代码>“E”位于
“D”
所在的位置(删除后),并且据迭代器所知,该位置已被迭代。迭代器只是按位置运行,我明白了。很公平!