2013-10-11 5 views
0

내가 만든 for 루프에 문제가있는 것 같습니다.ConcurrentModificationException 받기

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){ 
     if(rect.intersects(Ball.ball)){ 
      System.out.println("Collied"); 
     } 
    } 

이 오류가 발생합니다. 나는 유사한 프로그램에서 충돌을 확인하기 위해 동일한 유형의 체크를 사용했다. 어떤 도움도 크게 감사 할 것이다.

아, 그리고 오류 라인은 다음과 같습니다 당신이 알려 더 이상의 정보가 필요하면

:

for (Rectangle rect : Wall.wallRects){ 

Collison.checkCollison(); 

Ball.moveBall(); 

(D 난 그냥 단어 충돌 잘못 woops 맞춤법 검사 한 실현).

업데이트 : 방금 ​​내 Collison.checkCollsion()을 내 paint() 메소드로 이동했습니다. paint 메서드에서 Wall.rects에 rect를 추가했기 때문에 올바르게 작동하지 않는다고 생각합니다. 그래서 오류가 발생했습니다. 모두에게 도움을 주셔서 감사합니다.

+0

사람, 당신의 코드에서 어떤 경우 목록을 수정됩니다'Wall.wallRects'있는 동안 당신은리스트를 반복하려고 시도하고있다. – MadProgrammer

+0

실제로'checkCollision()'의 전체 코드인가? – iamnotmaynard

+0

'checkCollision'가 인수를 취하지 않는 방식은 모든 국가가 어떻게 든 글로벌하다는 것을 의미하므로 걱정이됩니다. 그래서 어디에서든지 변형 될 수 있습니다. 'Ball.ball'과'Wall.wallRects'가 더 많은 예입니다. 귀하의 전체 디자인은 정반대입니다. –

답변

0

또 다른 스레드가이 당신이 checkCollision 기능에 동기화

어떤 종류의 필요 방지하기 위해, 당신의 충돌 검사 중에 Wall.wallRects 배열을 수정합니다

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

및 Wall.wallRects는 다른 모든 장소에서

수정 - 같은 synchronized() 블록

UPDATE를 추가, 감사

요하는 경우를 @iamnotmaynard하기 u're 스레드를 사용하지 않는 - 당신은 예를 들어, 루프 내부 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

관련 문제