2013-10-11 26 views
0

我看到我創建的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中,所以這就是導致錯誤的原因。感謝所有人的幫助。

+0

有人在你的代碼的一些地方,正在修改的列表'Wall.wallRects'而你試圖迭代列表 – MadProgrammer

+0

這實際上是'checkCollision()'的完整代碼嗎? – iamnotmaynard

+0

'checkCollision'不採用任何參數的方式讓我擔心,因爲這意味着你所有的狀態都是某種全球性的,所以可能從任何地方發生變異。 'Ball.ball'和'Wall.wallRects'就是更多的例子。你的整個設計都是面向對象的。 –

回答

0

另一個線程中的碰撞檢查修改Wall.wallRects陣列,以避免這種情況,你需要在checkCollision功能某種同步

的:

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

,並在所有其他地方Wall.wallRects是修改 - 添加相同synchronized()

UPDATE,感謝@iamnotmaynard

如果喲你就像沒有使用線程 - 那麼,如果你做了一些修改,以內部循環Wall.wallRects,例如問題可以是:

for (Rectangle rect : Wall.wallRects){ 
Ball.moveBall(); // - if the function somehow modifies wallRects, you have error 
} 
+0

我不知道是否有理由斷定OP代碼中有其他線程。 – iamnotmaynard

+0

@iamnotmaynard同意,但它對於初學者很常見的問題 –

+2

那麼,對於初學者來說,使用線程通常是很常見的。我懷疑循環中調用的方法之一(在同一個線程中)試圖改變'rect'或'wallRects'。 – iamnotmaynard

相關問題