【问题标题】:Removing from an ArrayList gives me java.util.ConcurrentModificationException [duplicate]从 ArrayList 中删除给了我 java.util.ConcurrentModificationException [重复]
【发布时间】:2013-08-26 05:54:12
【问题描述】:

在这个 android 游戏中,我使用 ArrayList 来跟踪当前屏幕上的所有实体。运行列表允许我成功更新实体并将其添加到屏幕/列表,但尝试删除它们会给我一个 java.util.ConcurrentModificationException 错误。我是新手程序员,所以我真的不知道会出现什么问题。

我用来确定何时需要删除实体的方法(当它离开屏幕时,但只能通过顶部)是这样的。

private void deleteEntities() {
    for(Entity ent : entsOnLevel) {
        if((ent.getY() + ent.getImage().getHeight()) < 0) {
            this.entsOnLevel.remove(ent);
        }
    }
}

有人可以向我解释可能出了什么问题吗?

【问题讨论】:

  • @mirco.widmer 相同的异常,不同的原因。所以不是重复的问题。

标签: java android list arraylist


【解决方案1】:

您创建了一个迭代器并且您正在删除他的当前项目,因此他找不到下一个项目。

在此处阅读更多信息 -> ConcurrentModificationException?

【讨论】:

  • the description of fail-fast。您可以在Iterator 上显式循环(而不是使用增强的for 循环隐式循环)并调用it.remove()
  • 这个答案应该是重复投票
【解决方案2】:

您应该使用Iterator 从列表中删除一个元素。

    Iterator<YourDataType> it = YourList.iterator();
    while (it.hasNext()) 
           it.remove();

This 应该给你一些提示,为什么你应该使用迭代器。

【讨论】:

  • 使用迭代器从列表中删除似乎不起作用,即使我完全在不断更新的方法中使用您的代码。
  • 从不同的线程不断更新或只是多次调用?
  • 它是通过游戏循环调用的,所以大约每秒调用 60 次该方法。
  • 我想通了。我意识到每次我想使用迭代器时我都应该更新它,对吧?
【解决方案3】:

您面对的是ConcurrentModificationException,因为您同时对同一个list 执行两项操作。即同时循环和删除。

为了避免这种情况,请使用迭代器,它可以保证您安全地从列表中删除元素...

例如:

List<Object> objs;
Iterator<Object> i = objs.iterator();
while (i.hasNext()) {
   Object o = i.next();
  //some condition
    i.remove();
}

【讨论】:

  • 谢谢!我知道直接从列表中删除数据肯定有问题!我想我应该去阅读迭代器,对吧?我应该为我的更新方法使用类似的东西,还是按照我尝试执行删除方法的方式安全地执行它?
  • @JasonJahn 这里的经验法则是If you are modifying a Collection object while looping on it,使用迭代器。
  • 它不知道我是否使用了错误的迭代器,但是使用这种方法代替我的旧方法,以及增强的 for 循环,阻止了我的实体更新。 while (it.hasNext()) { 实体 ent = it.next(); ent.update(); }
  • 在这种情况下,您正在更新实体,而不是集合。所以不要在那里使用迭代器。使用普通的 foreach 循环并更新您的实体。更新集合意味着,添加和/删除它跨度>
  • 这很奇怪,因为从集合中删除似乎也不起作用。 private void deleteEntities() { while (it.hasNext()) { Entity ent = it.next(); if(ent.getY()
猜你喜欢
  • 2018-05-29
  • 2014-03-25
  • 2015-12-12
  • 1970-01-01
  • 2020-03-06
  • 2016-07-08
  • 2013-08-16
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多