2014-02-08 113 views
-1

我正在尝试制作一个在屏幕上浮动的Asteroid对象的小程序。如果两个小行星碰撞,那么速度较慢的小行星应该分解成两个较小的小行星。一旦小行星大小1,它应该消失。并发修改异常

当我尝试比较两个小行星时,我得到一个ConcurrentModificationException,我不知道为什么。

private volatile Collection<Asteroid> belt; 
private void handleCollisions() { 


    Collection<Asteroid> psuedoBelt = belt; 
    Iterator<Asteroid> one; 
    Iterator<Asteroid> two; 

    for (one = psuedoBelt.iterator(); one.hasNext();) { 
     Asteroid aOne = one.next(); 
     for (two = psuedoBelt.iterator(); two.hasNext();) { 

      Asteroid aTwo = two.next(); 
      if (aOne.collidesWith(aTwo)) { 
       if (aOne.getSpeed() > aTwo.getSpeed()) { 
        Collection<Asteroid> split = aTwo.split(); 
        two.remove(); 
        for (Iterator<Asteroid> three = split.iterator(); three 
          .hasNext();) { 
         psuedoBelt.add(three.next()); 
        } 
       } else { 
        Collection<Asteroid> split = aOne.split(); 
        one.remove(); 
        for (Iterator<Asteroid> three = split.iterator(); three 
          .hasNext();) { 
         psuedoBelt.add(three.next()); 
        } 
       } 
      } 
     } 
    } 

    belt = psuedoBelt; 

} 
+1

你做了什么研究吗?看看页面的右侧。 –

+0

http://stackoverflow.com/a/1496221/1376108 – wisemann

回答

1

首先,创建一个迭代器:

for (one = psuedoBelt.iterator(); one.hasNext();) { 

然后,第二个,在相同的集合:

for (two = psuedoBelt.iterator(); two.hasNext();) { 

然后,你与你的第二个迭代器中删除项目:

two.remove(); 

问题是第在从集合中删除项目时,第一个迭代器(one)不知道这种删除。

因此,在one.next()上,它检测到集合已被修改并引发此异常。

有2个解决方案,即:

  • 尽量只使用一个迭代器或
  • 保留项目的列表中删除,并在迭代您的收藏后,将其删除。
+0

如果第一个迭代器的对象具有较低的速度会怎么样? – Programatic

+1

@Programatic我不明白你的问题:迭代器不会同时执行,所以速度对执行顺序没有影响。 –