带有嵌套循环删除调用的java.util.ConcurrentModificationException

时间:2015-08-31 03:16:20

标签: java arraylist nested-loops nested-lists

尝试运行一些代码,但在运行时收到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();
                }
            }
        }
      }

1 个答案:

答案 0 :(得分:1)

来自ArrayList的javadoc:

  

此类的iteratorlistIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的removeadd方法,迭代器将抛出ConcurrentModificationException

由于您的两个迭代器(iteratoriiteratorj)正在迭代相同的列表,iteratori.remove()将导致iteratorj.remove()抛出错误。

由于missilesArrayList,您可以使用索引(int iint j)进行迭代,然后使用missiles.remove(i)missiles.remove(j)进行删除。当然,在删除列表中的项目时,您必须调整索引值。