从ArrayList中删除会产生java.util.ConcurrentModificationException
在这个android游戏中,我使用ArrayList来跟踪当前屏幕上的所有实体。通过运行列表,我可以成功地更新实体并将其添加到屏幕/列表中,但尝试删除它们会导致java.util.ConcurrentModificationException错误。我是一个新手程序员,所以我真的不知道会出什么问题 我用这个方法来确定当一个实体离开屏幕时,它什么时候需要被删除,但只有通过顶部从ArrayList中删除会产生java.util.ConcurrentModificationException,java,android,list,arraylist,Java,Android,List,Arraylist,在这个android游戏中,我使用ArrayList来跟踪当前屏幕上的所有实体。通过运行列表,我可以成功地更新实体并将其添加到屏幕/列表中,但尝试删除它们会导致java.util.ConcurrentModificationException错误。我是一个新手程序员,所以我真的不知道会出什么问题 我用这个方法来确定当一个实体离开屏幕时,它什么时候需要被删除,但只有通过顶部 private void deleteEntities() { for(Entity ent : entsOnLev
private void deleteEntities() {
for(Entity ent : entsOnLevel) {
if((ent.getY() + ent.getImage().getHeight()) < 0) {
this.entsOnLevel.remove(ent);
}
}
}
有人能告诉我出了什么问题吗?您创建了一个迭代器,并且正在删除他的当前项,因此他找不到下一项
请阅读此处的详细信息->您应该使用 应该给您一些提示,为什么要使用迭代器。您面临ConcurrentModificationException,因为您一次在同一个列表上执行两个操作。i、 e同时循环和移除 为了避免这种情况,请使用迭代器,它可以保证安全地从列表中删除元素 例:
看看您可以显式地在迭代器上循环,而不是隐式地使用增强的for循环并调用它。remove。这个答案应该是一个接近重复的答案vote@mirco.widmer同样的例外,不同的原因。这不是重复的问题,谢谢!我知道直接从列表中删除数据肯定有问题!我想我应该去读迭代器,嗯?我应该在我的更新方法中使用类似的方法,还是像我尝试删除方法时那样安全?@JasonJahn这里的一个经验法则是,如果你在循环时修改集合对象,请使用迭代器。它不知道我是否使用了迭代器错误,但使用此方法代替我的旧方法,使用增强的for循环,已停止更新我的实体。在这种情况下,虽然it.hasNext{Entity ent=it.next;ent.update;},但您正在更新实体,而不是集合。因此不要在那里使用迭代器。使用普通的foreach循环并更新您的实体。更新集合意味着从中添加和/删除这很奇怪,因为从集合中删除似乎也不起作用。private void deleteEntities{while it.hasNext{Entity ent=it.next;ifent.getY<800{it.remove;}}}}}我以前从未使用过stackoverflow,是否还有其他地方我应该讨论这个问题?使用迭代器从列表中删除似乎不起作用,即使我在一个方法中使用你的代码,这个方法会不断更新。从不同的线程不断更新,或者只是多次调用?它是在游戏循环中调用的,所以大约每秒调用60次。我找到了答案。我意识到每次我想使用迭代器时我都应该更新它,是吗?
Iterator<YourDataType> it = YourList.iterator();
while (it.hasNext())
it.remove();
List<Object> objs;
Iterator<Object> i = objs.iterator();
while (i.hasNext()) {
Object o = i.next();
//some condition
i.remove();
}