我按照测试ConcurrentModificationException
概念写了这个例子:
public class Person
{
String name;
public Person(String name)
{
this.name = name;
}
}
public static void main(String[] args)
{
List<Person> l = new ArrayList<Person>();
l.add(new Person("a"));
l.add(new Person("b"));
l.add(new Person("c"));
int i = 0;
for(Person s : l)
{
if(s.name.equals("b"))
l.remove(i);
i++;
}
for(Person s : l)
System.out.println(s.name);
}
当我执行上面的main方法时,ConcurrentModificationException
不会被抛出,输出控制台会输出以下结果:
a
c
根据我对此问题的了解,当在循环列表中时,在修改列表时,应抛出ConcurrentModificationException
异常。但为什么在我的样本中这不会发生?
答案 0 :(得分:1)
没有保证对列表的结构修改会抛出ConcurrentModificationException
。
请注意,无法保证快速失败的行为,因为一般来说,在存在不同步的并发修改时,无法做出任何硬性保证。快速失败的操作会尽最大努力抛出
ConcurrentModificationException
。因此,编写依赖于此异常的程序以确保其正确性是错误的:ConcurrentModificationException
应仅用于检测错误。
在这种特殊情况下,你是“幸运的”(或“不幸”取决于你如何看待它)。由于在执行另一次修改检查之前存在循环,因此结构变化不被注意。
有关详细说明,请参阅dup中的答案: