1

我发现我创建的 for 循环有问题。

    for (Rectangle rect  : Wall.wallRects){
        if(rect.intersects(Ball.ball)){
            System.out.println("Collied");
        }
    }

这会引发此错误:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.thejacksullivan.breakout.Collison.checkCollison(Collison.java:14)
at com.thejacksullivan.breakout.Ball.moveBall(Ball.java:23)
at com.thejacksullivan.breakout.Core.main(Core.java:48)

它的调用来自:

public class Ball {

public static Rectangle ball;
public static int x = 250;
public static int y = 200;
public static int dx = 4;
public static int dy = 4;
public static int dia = 30;

public static void moveBall(){
    ball = new Rectangle(x, y, 15, 15);

    if(x + dx < 0 || x + dia + dx > Core.frame.getWidth()){
        dx *= -1;
    }
    if(y + dy < 0 || y + dia + dy > Core.frame.getHeight()) {
        dy *= -1;
    }
    Collison.checkCollison();
    x += dx;
    y += dy;


}
}

我不确定如何解决这个问题。我在类似的程序中使用了相同类型的碰撞检查,任何帮助将不胜感激。

哦,错误行是:

for (Rectangle rect  : Wall.wallRects){

Collison.checkCollison();

Ball.moveBall();

(我刚刚意识到我拼错了 Collision 这个词,呜呜:D)

如果您需要更多信息,请告诉我。

更新:我刚刚将 Collison.checkColllsion() 移至我的 paint() 方法。我相信它不能正常工作,因为我在绘画方法中将我的矩形添加到 Wall.rects,所以这就是导致错误的原因。感谢大家的帮助。

4

1 回答 1

0

另一个线程在您的碰撞检查期间修改 Wall.wallRects 数组,为避免这种情况,您需要某种同步

在 checkCollision 函数中:

synchronized(Wall.wallRects)
{
for (Rectangle rect  : Wall.wallRects){
        if(rect.intersects(Ball.ball)){
            System.out.println("Collied");
        }
    }
}

以及在 Wall.wallRects 被修改的所有其他地方 - 添加相同的synchronized()

更新,感谢@iamnotmaynard

如果您不使用线程 - 那么问题可能是如果您在循环内对 Wall.wallRects 进行一些修改,例如:

for (Rectangle rect  : Wall.wallRects){
Ball.moveBall(); // - if the function somehow modifies wallRects, you have error
}
于 2013-10-11T20:50:23.823 回答