Java 更新Arraylist中的项会引发ConcurrentModificationException
我正在用lwjgl和slick用java制作一个游戏。我有一个世界,它包含一个arraylist,所有项目都放在需要更新的地方。但当它第二次更新这些项时,会抛出ConcurrentModificationException 我怎样才能解决这个问题 这是完整的错误:线程主java.util.ConcurrentModificationException中出现异常 在java.util.ArrayList$Itr.checkForComodificationUnknown源中 位于java.util.ArrayList$Itr.nextUnknown Source 位于com.jakibah.infinyvale.World.HandleItemsWorld.java:43 位于com.jakibah.infinyvale.World.UpdateWorld.java:65 位于com.jakibah.infinyvale.Game.UpdateGame.java:29 位于com.jakibah.infinyvale.Canvas.CreateCanvasCanvas.java:41 位于com.jakibah.infinyvale.Game.mainGame.java:16 这是我的代码: 世界:Java 更新Arraylist中的项会引发ConcurrentModificationException,java,arraylist,lwjgl,slick,Java,Arraylist,Lwjgl,Slick,我正在用lwjgl和slick用java制作一个游戏。我有一个世界,它包含一个arraylist,所有项目都放在需要更新的地方。但当它第二次更新这些项时,会抛出ConcurrentModificationException 我怎样才能解决这个问题 这是完整的错误:线程主java.util.ConcurrentModificationException中出现异常 在java.util.ArrayList$Itr.checkForComodificationUnknown源中 位于java.util
}迭代时,您正在从ArrayList中删除一个项,并导致它抛出ConcurrentModificationException 让我们跟踪您的代码
public synchronized void HandleItems() {
if (!items.isEmpty()) {
for (Item i : items) {
i.Update();
}
}
}
这将调用项对象上的更新,即:
public void Update() {
Draw();
CheckPickUp();
}
public void CheckPickUp(){
if(Canvas.isColliding(Game.p.getX(), Game.p.getY(), Game.p.getX() + 32, Game.p.getY() - 32, x, y));
System.out.println("Colliding");
this.ToBag();
}
public void ToBag() {
Inventory i = null;
i = Game.p.getI();
Game.world.getItems().remove(this);
i.getInventory().add(new BagItem(type, i, tex, texturefactor, durability, power));
}
注意烟草。您正在从实际上正在迭代的集合中删除Item对象
基本上,您必须使用迭代器,而不是直接从arraylist中删除
有关更多说明,请参阅本网站中的类似问题:
您是Item.toBag导致此异常。line Game.world.getItems.removethis;正在尝试从ArrayList中删除该项
不能在for each循环中修改列表。您只能在直接使用迭代器时调用remove方法。将代码以文本形式粘贴到此处,格式正确。不要发布指向外部源的链接;iterator.hasNext;{Item Item=iterator.next;ifitem==this{iterator.remove;}}现在它仍然抛出一个错误。您必须在HandleItem方法中使用它,并以某种方式将迭代器传递到您删除的位置。
public synchronized void HandleItems() {
if (!items.isEmpty()) {
for (Item i : items) {
i.Update();
}
}
}
public void Update() {
Draw();
CheckPickUp();
}
public void CheckPickUp(){
if(Canvas.isColliding(Game.p.getX(), Game.p.getY(), Game.p.getX() + 32, Game.p.getY() - 32, x, y));
System.out.println("Colliding");
this.ToBag();
}
public void ToBag() {
Inventory i = null;
i = Game.p.getI();
Game.world.getItems().remove(this);
i.getInventory().add(new BagItem(type, i, tex, texturefactor, durability, power));
}