尝试运行一些代码,但在运行时收到java.util.ConcurrentModificationException
错误。我认为这是因为我在同一个arraylist上使用嵌套循环并从“并发”的索引中删除。我该如何避免这个问题?提前感谢您的帮助。
for(Iterator<Missile> iteratori = missiles.iterator(); iteratori.hasNext();)
{
Missile missile = iteratori.next();
if(missile.type == 2)
{
for(Iterator<Missile> iteratorj = missiles.iterator(); iteratorj.hasNext();)
{
Missile missilej = iteratorj.next();
if(missilej.equals(missile)){
continue;
}
double cal1 = missilej.xPos - missile.xPos;
double cal2 = missilej.yPos - missile.yPos;
double radius = Math.sqrt(cal1*cal1 + cal2*cal2);
if(radius < missile.blastRadius)
{
//collision detection is throwing array out of bounds errors
missile.detonate();
missilej.detonate();
iteratori.remove();
iteratorj.remove();
}
}
}
}
答案 0 :(得分:1)
来自ArrayList的javadoc:
此类的
iterator
和listIterator
方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove
或add
方法,迭代器将抛出ConcurrentModificationException
。
由于您的两个迭代器(iteratori
和iteratorj
)正在迭代相同的列表,iteratori.remove()
将导致iteratorj.remove()
抛出错误。
由于missiles
是ArrayList
,您可以使用索引(int i
和int j
)进行迭代,然后使用missiles.remove(i)
和missiles.remove(j)
进行删除。当然,在删除列表中的项目时,您必须调整索引值。