我看到我創建的for循環出現問題。獲取ConcurrentModificationException
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();
(我才意識到我一直在拼寫的單詞碰撞錯誤,woops:d)
如果您需要任何更多的信息讓我知道。
更新: 我剛剛將我的Collison.checkCollsion()移到了我的paint()方法中。我相信它不能正常工作,因爲我在paint方法中將我的rects添加到Wall.rects中,所以這就是導致錯誤的原因。感謝所有人的幫助。
有人在你的代碼的一些地方,正在修改的列表'Wall.wallRects'而你試圖迭代列表 – MadProgrammer
這實際上是'checkCollision()'的完整代碼嗎? – iamnotmaynard
'checkCollision'不採用任何參數的方式讓我擔心,因爲這意味着你所有的狀態都是某種全球性的,所以可能從任何地方發生變異。 'Ball.ball'和'Wall.wallRects'就是更多的例子。你的整個設計都是面向對象的。 –