我有对象Bullet,我同时将它们添加到两个ArrayList中,下面简要介绍了这些列表。完成某些操作后,我希望从两个列表中删除一个项目符号。这种方法正确吗?我不断收到错误:java.util.ConcurrentModificationException
或者,您是否可以想到以这种方式处理对象的方法比ArrayList更好的解决方案?
//there are ArrayList<Bullet> bullets and ArrayList<Updatable> updatable, in the class
public void removeBullet(Bullet bullet) {
for (ListIterator<Bullet> bulletIterator = bullets.listIterator(); bulletIterator.hasNext();) {
Bullet tempBullet = bulletIterator.next();
if (tempBullet.equals(bullet)) {
for (ListIterator<Updatable> updatableIterator = updatable.listIterator(); updatableIterator.hasNext();) {
Updatable tempUpdatable = updatableIterator.next();
if (tempUpdatable.equals(bullet)) {
updatableIterator.remove();
bulletIterator.remove();
return;
}
}
}
}
}
编辑:问题的根源是我在列表中的一个上使用了一个迭代器,恰好同时在另一个地方,因此出现了错误。对于可更新列表,此代码工作正常。
发生ConcurrentModificationException的原因是,您试图从Iterator中删除项目符号,而您同时也在for循环中迭代该项目符号;java不喜欢您执行此操作,并且会引发异常。
为了解决这个问题,您将必须遍历两个Iterators并分别将其删除,或者如rdonuk所述,只需使用ArrayListremove()
方法,如果您尝试删除ArrayList中没有的内容,该方法将不会引发任何异常。true
如果对象被删除,它将返回,false
否则,您甚至不必首先检查要删除的对象是否包含在ArrayList中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句