在迭代时将游戏对象添加到列表中

时间:2015-03-13 10:24:09

标签: java libgdx

我需要将游戏对象添加到列表中。在这个private ArrayList<GameObject> list;列表中,我保存了所有游戏数据(敌人,积木,砖块等......)。我是怎么做的

for(GameObject t : list){
    if(Enemy.count < 20){
        list.add(new Enemy(100, 100, true));
    }
}

我得到了这个例外

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)

3 个答案:

答案 0 :(得分:1)

此代码可以重写

   for(GameObject t : list){
        if(Enemy.count < 20){
            list.add(new Enemy(100, 100, true));
        }
    }

作为

if(Enemy.count < 20){
for(int i=0;i<list.size();i++){
            list.add(new Enemy(100, 100, true));
}}

答案 1 :(得分:1)

另一个解决方案是暂时使用另一个列表:

List<GameObject> toAdd = new ArrayList<>();
for(GameObject t : list){
  if(Enemy.count < 20){
    toAdd.add(new Enemy(100, 100, true));
  }
}
list.addAll(toAdd);

答案 2 :(得分:0)

当你尝试修改列表时,你会得到java.util.ConcurrentModificationException异常。

- 如果目的只是删除对象,则使用迭代器而不是直接遍历它。但是我知道,你需要添加它们,因此使用第二种方法

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
    String str = iter.next();
      if( str.equals("B") )
      {
        iter.remove();
      }
}

- 使用CopyOnWriteArrayList而不是简单的ArrayLists,您可以按原样使用现有代码。

List<GameObject> list = new CopyOnWriteArrayList<GameObject()>;
for(GameObject t : list){
    if(Enemy.count < 20){
        list.add(new Enemy(100, 100, true));
    }
}