2015-03-13 75 views
2

我需要將遊戲對象添加到列表中。在這張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) 
+2

你不能修改陣列whhile你通過它itterating,解決方案之一是每次當你通過它循環的時候,是創建副本。顯示更多的代碼,然後我們可以制定出適當的解決方案 – user902383 2015-03-13 10:27:00

+0

但是創建副本聽起來像是浪費資源 – user2865835 2015-03-13 10:30:09

+0

實際上你在迭代時是否在做任何事情,或者在你提供的代碼中是否缺少一些行? – SimonPJ 2015-03-13 10:32:25

回答

1

另一種解決方案是臨時使用另一個列表:

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

這個代碼可以rewrtitten

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)); 
}} 
0

你會得到的java.util .ConcurrentModificationException異常,當你嘗試在迭代它的同時修改列表。

- 如果目的僅僅是刪除對象,則使用迭代器而不是直接遍歷它。但我看到,你需要添加它們,因此使用第二種方法

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

- 使用的CopyOnWriteArrayList,而不是簡單的ArrayList,您可以使用你現有的代碼不變。

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