簡體   English   中英

刪除項目時ArrayList迭代器並發修改異常

[英]Arraylist iterator concurrent modification exception when removing item

因此,此問題與我在此處發現的其他有關修改列表時的並發異常的問題有些不同-因為此問題發生在我修改列表中對象的內部列表時。 這是訪問內部列表的唯一方法

這是我調用方法的地方

public void interactWithItem(int targetIDX, int targetIDY){
    for(Iterator<Item> it = listOfAllItems.iterator(); it.hasNext();){
        Item tempItem = it.next();
        //Maybe i should refine more, in world, so forth
        if(tempItem.tilePosX == targetIDX && tempItem.tilePosY == targetIDY){
            if(tempItem.name.equals("chest")){
                System.out.println("Interacting with Chest!");
                if(!tempItem.containedItems.isEmpty()){
                    for(Iterator<Item> tempIt = tempItem.containedItems.iterator(); tempIt.hasNext();){
                        Item tItem = tempIt.next();
                        System.out.println("Chest contains "+tItem.name+" "+tItem.amount);
                        Character.c.addItem("player", tItem.name, tItem.amount);
                        removeContainedItem("chest", tItem.name);
                    }
                }else{
                    System.out.println("Chest is empty");
                }
            }
        }
    }
}

如果我注釋掉i.remove(),這就是導致問題的方法; 這個問題抓住了發生,所以只有將其刪除后,再沒有其他方法或類正在訪問內部列表?

public void removeContainedItem(String containerName, String itemName){

    System.out.println("Removing "+itemName+" in "+containerName);
    for(Iterator<Item> it = listOfAllItems.iterator(); it.hasNext();){
            Item tItem = it.next();
        if(tItem.name.equals(containerName)){
            for(Iterator<Item> i = tItem.containedItems.iterator(); i.hasNext();){
                Item tempItem = i.next();
                System.out.println(tempItem.name);
                if(tempItem.name.equals(itemName)){
                    i.remove();
                }
            }
        }
    }
}

感謝您的所有幫助! 希望有人可以澄清並給我有關如何解決此問題的說明? 我有點茫然。

在迭代之間修改集合時,會發生並發修改異常。 我們可以使用ConcurrentHashMap或CopyOnWriteArrayList來解決此問題。

如果遇到UnsupportedOperationException,請將ArrayList更改為LinkedList

可能 :

**Item tItem = tempIt.next();**

創建項目時,您可以將其添加到多個列表中。 當其中之一嘗試修改它時,您會得到例外。 由於清單列表使用的是同一項目,因此完全相同。

可能會幫助解決的問題是:

Item newItem = new Item();
newItem  = tempIt.next();

只需為每個列表創建一個新項目,然后根據需要對其進行修改。

或為創建新列表:

public void removeContainedItem(String containerName, String itemName){

並使用項目修改新的副本列表,然后將上一個列表設置為已修改的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM