Java 带有2个迭代器和一个ArrayList的ConcurrentModificationException

Java 带有2个迭代器和一个ArrayList的ConcurrentModificationException,java,arraylist,iterator,Java,Arraylist,Iterator,我有一个快速问题,涉及一个ArrayList、两个迭代器和一些嵌套for循环。我试着用多个重力井相互拉动并移动来制造一个重力引擎。为了做到这一点,Iv制作了这些重力井的阵列列表,所有这些重力井都以随机大小随机放置在屏幕上。这是供参考的 for(int i = 0; i < amount; i++){ // makes all int mass = rand.nextInt(45,65); int locX = rand.nextInt(50, getWidth()

我有一个快速问题,涉及一个ArrayList、两个迭代器和一些嵌套for循环。我试着用多个重力井相互拉动并移动来制造一个重力引擎。为了做到这一点,Iv制作了这些重力井的阵列列表,所有这些重力井都以随机大小随机放置在屏幕上。这是供参考的

for(int i = 0; i < amount; i++){ // makes all 
      int mass = rand.nextInt(45,65);
      int locX = rand.nextInt(50, getWidth()-100);
      int locY = rand.nextInt(50, getHeight()-100);
      Color cColor = rand.nextColor();

      if(mass%8==0){
        mass = rand.nextInt(25,35);
      }
      else if(mass%7==0){
        mass = rand.nextInt(75,85);
      }


      Body body = new Body((double)locX,(double)locY,mass);
      body.setFilled(true);
      body.setColor(Color.WHITE);
      body.setFillColor(cColor);
      add(body);
      bodys.add(body);
    }
for(inti=0;i
bodys是包含所有内容的ArrayList的名称。所以我真正的问题是迭代器。下面是给我带来麻烦的代码:

  public void move(){
    Iterator<Body> eIter = bodys.iterator();
    while(eIter.hasNext()){ // finding the thing we edit
      Body edit = eIter.next();

      int addX = 0, addY = 0;
      int totalX = 0, totalY = 0;
      double ex = edit.getX(), ey = edit.getY();
      double eMass = edit.getMass(), eSize = edit.getHeight();
      double eMoveX = edit.getMoveX(), eMoveY = edit.getMoveY();
      int placeInArrayEdit = bodys.indexOf(edit);

      Iterator<Body> fIter = bodys.iterator();

      while(fIter.hasNext()){ // iterating through the force pulling the edit body
        Body force = fIter.next(); /// ConcurrentModificationException is thrown
        int placeInArrayForce = bodys.indexOf(force);

        if(placeInArrayForce != placeInArrayEdit){ // making sure the 2 bodys arent the same

          double fx = force.getX(), fy = force.getY();
          double fMass = force.getMass();
          double fMoveX = force.getMoveX(), fMoveY = force.getMoveY();


          double difX = (ex-fx);
          double difY = (ey-fy);

          double distX = distanceP(ex, fx);
          double distY = distanceP(ey, fy);

          double vecX = (difX/distX);
          double vecY = (difY/distY);

          if(distance(fx,ex,fy,ey) <= eSize/3){ // if they are colliding
            if(eMass >= fMass){
              remove(edit);
              edit.addMass((int)(fMass));
              eIter.remove(); // problem
            }
            if(eMass < fMass){
              remove(force);
              force.addMass((int)(eMass));
              fIter.remove();
            }
          }

          double grav = (eMass/fMass);
          grav -= (grav*.50);

          addX -= (vecX/grav)/2; // this determines movement which means i
          addY -= (vecY/grav)/2; // need to edit this with fMass
        }
        edit.setVelX(addX/(eMass + (eMass*.75)));
        edit.setVelY(addY/(eMass + (eMass*.75)));

        edit.addMoveX(edit.getVelX());
        edit.addMoveY(edit.getVelY());

        edit.move(edit.getMoveX(),edit.getMoveY());
      }
    }
  }
公共作废移动(){
迭代器eIter=bodys.Iterator();
while(eIter.hasNext()){//查找我们编辑的内容
Body edit=eIter.next();
int addX=0,addY=0;
int totalX=0,totalY=0;
double ex=edit.getX(),ey=edit.getY();
double eMass=edit.getMass(),eSize=edit.getHeight();
double eMoveX=edit.getMoveX(),eMoveY=edit.getMoveY();
int placeinarayedit=bodys.indexOf(编辑);
迭代器fIter=bodys.Iterator();
而(fIter.hasNext()){//遍历拉动编辑主体的力
Body force=fIter.next();///ConcurrentModificationException被抛出
int placeinarayforce=车身索引of(力);
如果(placeInArrayForce!=placeInArrayEdit){//请确保两个实体不相同
double fx=force.getX(),fy=force.getY();
double fMass=力。getMass();
double fMoveX=force.getMoveX(),fMoveY=force.getMoveY();
双difX=(外汇汇率除外);
双difY=(ey-fy);
双距离x=距离p(ex,fx);
双距离=距离P(ey,fy);
双vecX=(difX/distX);
双向量=(difY/distY);
if(距离(fx、ex、fy、ey)=fMass){
删除(编辑);
编辑.addMass((int)(fMass));
eIter.remove();//问题
}
if(eMass
上面的代码是移动重力井和测试碰撞。问题是ConcurrentModificationException是在iv注释要抛出的地方抛出的

我花了大约一个小时左右的时间四处寻找解决方案,但我尝试的任何方法都无效。这段代码一直工作到两口井实际相撞为止,然后抛出错误。在仍然像这样测试冲突的情况下,有没有办法避免这个错误,或者我的代码就是太坏了

谢谢你的帮助!如果您需要任何澄清,请告诉我,因为这是我关于StackOverflow的第一个问题

请参阅以下内容的javadoc:

此类的
迭代器
列表迭代器
方法返回的迭代器是快速失效的:如果在创建迭代器后的任何时候列表在结构上被修改,则以任何方式,除了通过迭代器自己的
删除
添加
方法之外,迭代器将抛出一个
ConcurrentModificationException
。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

因此,您有两个迭代器:
eIter
用于外循环,而
fIter
用于内循环。
调用
eIter.remove()
时,
fIter
会坏掉。
调用
fIter.remove()
时,
eIter
会坏掉。
(如果您调用了
bodys.remove(index)
,两者都会坏掉。)

无论哪种方式,其中一个迭代器都会过时,并且在调用
next()
时会抛出
ConcurrentModificationException

此外,当您调用
eIter.remove()
时,不会中断内部循环,因此您可能会在内部循环的另一次迭代中再次尝试这样做


简而言之,您需要找到另一种方法,例如使用索引和
get(index)
调用,或者类似的方法。

您可以为此向我发送一个eclipse项目吗?正如我前面所说,我是stackoverflow的新手,所以我不知道如何与您联系。如果您能告诉我,我们将不胜感激。我们必须将所有答案和问题保存在本网站上。。但是如果你转到我的用户档案,你会在ispecsoft.com上找到我。这个网站的目的是建立一个问答语料库,未来的读者可以从中找到帮助。通过其他网站/私下交换帮助有点达不到目的。我不会阻止你——显然,我不能——但是考虑到一旦你“对外接触”,就删除这个问题,因为这个问题对其他人没有用。“CAMartin不需要这种态度。如果OP的问题真的需要一个完整的eclipse项目来提供答案,那么对于SO的格式来说,这个问题太宽泛了。像这样的问题应该