【发布时间】:2016-05-30 18:46:30
【问题描述】:
我有一个简单的问题,涉及一个 ArrayList、2 个迭代器和一些嵌套的 for 循环。我试图使用多个重力井相互拉动并四处移动来制作一些重力引擎。为此,Iv 制作了这些重力井的 ArrayList,所有这些都以随机大小随机放置在屏幕上。供参考。
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);
}
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());
}
}
}
上面的代码正在移动重力井并测试碰撞。问题是 ConcurrentModificationException 在iv注释它被抛出的地方被抛出。
我花了大约一个小时左右四处寻找解决方案,但我尝试过的任何方法都没有奏效。代码一直运行,直到井实际相互碰撞,然后引发错误。有没有办法在仍然测试这样的碰撞时避免这个错误,或者我的代码太坏了?
感谢大家的帮助!如果您需要任何澄清,请告诉我,因为这是我在 StackOverflow 上的第一个问题
【问题讨论】:
-
你能给我发一个 Eclipse 项目吗?
-
正如我之前所说,我是stackoverflow 的新手,所以我不知道如何与您联系。如果您能告诉我,将不胜感激。
-
我们必须将所有答案和问题保留在此站点中。但如果您访问我的用户资料,您会在 ispecsoft.com 上找到我
-
这个网站的目的是建立一个问答语料库,供未来的读者寻求帮助。通过其他站点/私下交换帮助有点违背了目的。我不会阻止你 - 显然,我不能 - 但是在你“外部”联系后考虑删除这个问题,因为这个问题对其他人没有用处。
-
@CAMartin 不需要这种态度。如果 OP 的问题确实需要整个 eclipse 项目才能提供答案,那么对于 SO 的格式来说,这个问题太宽泛了。像这样的问题应该提交minimal, complete, verifiable example。发布一个 Eclipse 项目可能是完整的,但肯定不是最小的,特别是因为这种行为实际上与 Eclipse 无关。