2016-02-03 84 views
1

我的代码(缩减到基本要点如下);当hasNext()被称为最后一次时,它抛出ConcurrentModificationException- PS-我试过调试它,而且我似乎无法确定如何使其工作。如果我切换remove和add方法,它会起作用,但是如果somethingElse =没有真正有用的东西,它将删除唯一的值。迭代器并发修改错误(Java)

PS-我知道解决的办法here的;但我需要它之后去除值增加,这是造成问题的

Iterator<String> itr = something.iterator(); 
while (itr.hasNext()){ 
    String x = itr.next(); 
    itr.remove(); 
    somethingElse.add(x);    
} 

编辑 - somethingElse可以的东西或新对象的全部在一起(有这个决定该环路) 这是我第一次后如果它太抽象或者代码不清晰,请告诉我,我会发布我的完整代码。

谢谢! :)

+1

你确定'something'和'somethingElse'是两个不相关的对象吗? – Codebender

+0

你能澄清什么是'somethingElse'。循环中发生的每个操作都必须通过迭代器。如果不使用迭代抛出了'ConcurrentModificationException' –

+0

somethingElse可东西(有一个循环,来确定是否somethingElse的东西或新的对象) – JsDart

回答

0

什么是你的问题所理解的 - 任何时间点SomethingElse可以是something

如果这是你会得到concurrentModificationException因为你是遍历列表,并在您要更新它同一时间的情况下。

因此iterator不知道底层data structure发生了什么,它会坚持它的政策fail-fast之前发生可怕的错误。

(核心值,后跟JDK读取和写入,应摆好处理)

+0

这很有道理,谢谢你解释。但是,交换删除和添加的顺序可修复错误;你能否在解释问题之前向我解释为什么? – JsDart

+0

交换订单没有任何区别。可能是当你交换后运行'someThingElse'确实是一个满足'JVM'的新列表,它适用于你,但在所有其他情况下它将失败。 – Helios

0

.remove,因为要修改的列表,而迭代thorugh它抛出这个错误。您可以使用ConcurrentHashMap和CopyOnWriteArrayList类来修复此错误。

请参考有关错误的明确的解释链接here