从列表中删除项目时的Java并发修改异常

时间:2012-11-23 11:38:55

标签: java android

  

可能重复:
  java.util.ConcurrentModificationException on ArrayList

我正在尝试从线程内的列表中删除项目。我得到了ConcurrentModificationException。我从这个link读到它与从列表中删除项目有关。我将下面的示例代码。在我的情况下如何在没有此例外的情况下正确执行此操作。

try 
{
    for(Game game:appDeleg.getGlobalGames().getGames())
    {
        if(game.getOwner().getId().equals(params[0]))
        {
            synchronized (appDeleg.getGlobalGames().getGames())
            {
                appDeleg.getGlobalGames().getGames().remove(game);
            }
        }

    }
}

catch (Exception e) 
{
    e.printStackTrace();
    return "noconnection";
}

5 个答案:

答案 0 :(得分:5)

使用Iterator:

Iterator<Game> i = appDeleg.getGlobalGames().getGames().iterator();

Game game;
while(i.hasNext()) {
    game = i.next();
    if(game.getOwner().getId().equals(params[0]))
          i.remove();
    }
}

答案 1 :(得分:1)

在新列表中收集要删除的项目,并在循环显示原始列表后将其删除。

答案 2 :(得分:1)

synchornized关键字不会在这里保护你。
您可以从单线程应用程序到达此异常事件(是的 - 您可以声明该异常的名称具有误导性)。
这应该使用迭代器迭代列表来完成,
(这将允许您在达到要删除的值时调用删除),
或者将要删除的元素收集到单独的列表中,然后对其运行removeAll方法。

答案 3 :(得分:1)

迭代时无法删除列表项,它会抛出ConcurrentModificationException

  

如果在创建迭代器后的任何时候对列表进行结构修改,   以任何方式除了通过迭代器自己的remove或add方法之外,迭代器   将抛出ConcurrentModificationException。因此,面对并发   修改,迭代器快速干净地失败,而不是任意冒险,   未来未确定时间的非确定性行为。

docs - &gt; link

您应该Iterator从列表中删除项目。

答案 4 :(得分:1)

增强的for循环使用迭代器。如果某些东西在迭代它时修改了集合,迭代器就会抛出异常。

在您的情况下,您通过集合删除项目而不是通过迭代器。

尝试使用标准for循环而不使用隐含迭代器。 假设您的集合是一个数组列表。

ArrayList games = appDeleg.getGlobalGames().getGames();
for(int i=0;i<games.size();i++){
      Game game = games.get(i);
      if(game.getOwner().getId().equals(params[0])){
       games.remove(i);

      }
}
相关问题