我发现我创建的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();
(我刚刚意识到我拼写错误的拼写错误,woops:D)
如果您需要更多信息,请告诉我们。
更新: 我刚把我的Collison.checkCollsion()移到了我的paint()方法中。我认为它无法正常工作,因为我在paint方法中将我的rects添加到Wall.rects,因此导致错误的原因。感谢大家的帮助。
答案 0 :(得分: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
}