我正在开发一个游戏项目。到目前为止这么好,但我只是坚持ome基本的东西,我无法找到解决方案,并使其正常工作。我决定来这里问你一些建议。
问题:
当玩家接触钻石时,我想从水平和包含世界上所有物体的arraylist中移除钻石。总是会发生我在调用remove()方法后得到异常错误消息。
CODES: 1.Class列表:EDIT_1
private ArrayList<AbstractObject> objects = new ArrayList<AbstractObject>();
public void removeObject(String name){
ArrayList<AbstractObject> newest = new ArrayList<AbstractObject>();
ListIterator<AbstractObject> delete=objects.listIterator();
while(delete.hasNext()){
if(name.equals(delete.next().getName())){
delete.remove();
}
else{
delete.previous();
newest.add(delete.next());
}
}
objects=newest;
}
2.Player类调用removeObject方法:EDIT_1
public void playerLogic(){
fallingDown();
for(AbstractObject object : this.getWorld().getListOfObjects()){ <--------ERROR HERE
if(this.intersects(object)){
if(object instanceof FinishZone && points>=getWorld().getDiamondCount()){
if(!(getWorld().getManager().isMoreLevels())){
getWorld().getMenu().openMenu(true);
}
else{
this.getWorld().getManager().nextLevel();
}
}
if(object instanceof Diamond){
points++;
this.getWorld().removeObject(object.getName());
}
}
}
}
ERROR:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at project.objects.characters.Player.playerLogic(Player.java:77)
at project.objects.characters.Player.update(Player.java:70)
at project.world.World.update(World.java:110)
at project.Main.update(Main.java:122)
at project.Main.run(Main.java:65)
at java.lang.Thread.run(Thread.java:745)
我检查了一些从arraylist中删除项目的例子,但我找不到区别。
EDIT_1: 所以我想出了如何做到但我总是得到错误。我编辑了removeobject代码块。这与我为测试创建的中性列表很有效。我把我不想删除的所有项目都放到一个新的列表中,而不是用最新的arraylist覆盖旧的arraylist。它没有异常错误。当我对游戏列表做同样想要编辑它时抛出同样的错误。 如果可能存在问题,我也会把渲染代码放在那里......
public void render(Graphics g) {
if(menu.getChoice()==-1){
menu.render(g);
}
else if(menu.getChoice()==0){
g.setColor(Color.white);
for(AbstractObject tempObj : objects){
tempObj.render(g);
}
}
}
FIXED: 我改变了起始列表是ListIterator,而不是在将项目添加到ListIterator之前将项目放在arrayList中。所有方法都改为迭代。工作正常:))
答案 0 :(得分:2)
在迭代列表时,您无法移除对象。
一个选项 - 使用iterator.remove()
- 如果使用迭代器进行迭代,而不是使用&#34;增强的for循环&#34;。您需要稍微修改您的循环代码,但功能将相同。
另一个:在辅助列表中存储要删除的所有对象,并在循环结束时将它们全部删除。