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.checkCollsion() を paint() メソッドに移動しました。paint メソッドで rects を 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 に答える