-2

我不明白为什么这个方法会抛出异常:

public void add(Object obj){
    gameObjects.add(obj); //here the exception happens
}

...虽然这个没有:

public void add(Object obj){
    gameObjects.add(obj); // no exception actually happens here 
    gameObjects.remove(obj);
}

考虑到这是运行时异常,为什么会发生这种情况?

例外:

Exception in thread "Thread-0" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at threads.Main.tick(Main.java:181)
    at threads.Main.run(Main.java:104)

该方法为对象内的刻度方法调用。

gameObjects不为空:

List<Object> gameObjects = new ArrayList<Object>(128);
4

4 回答 4

3

看起来您正在尝试将其添加到循环中。Java 不允许这样做。如果您以相同的方法添加然后删除,您实际上并没有做太多,净变化没有什么不同,因此您不会尝试在循环期间更改集合。

如果要添加它,则必须使用迭代器来添加。

于 2013-07-01T18:04:18.560 回答
2

第一种方法会引发异常,因为您正在循环修改某个集合。第二个没有,因为集合没有净变化;您添加然后删除一个元素。

请注意,它不是add检查 a 的方法ConcurrentModificationException。而是在每次循环迭代结束时检查集合是否有任何修改。

于 2013-07-01T18:05:34.110 回答
0

object遍历时不能更改相同的内容。

JavaDoc说的

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出 ConcurrentModificationException。

有关更多详细信息,请点击这些链接。他们可能会帮助你学习。

并发修改异常 http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html

于 2013-07-01T18:08:43.610 回答
0

根据文档

当这种修改是不允许的时,检测到对象的并发修改的方法可能会抛出此异常。

例如,通常不允许一个线程在另一个线程对其进行迭代时修改 Collection。一般来说,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些迭代器实现(包括 JRE 提供的所有通用集合实现的那些)可能会选择抛出此异常。这样做的迭代器被称为快速失败迭代器,因为它们快速而干净地失败,而不是在未来不确定的时间冒着任意的、非确定性的行为的风险。

于 2013-07-01T18:05:56.953 回答