Исключение одновременной модификации итератора Arraylist при удалении элемента - PullRequest
0 голосов
/ 11 мая 2018

Таким образом, этот вопрос немного отличается от других, о которых я узнал здесь, о параллельном исключении при изменении списка - потому что это происходит при изменении внутреннего списка объекта в списке.Это единственный метод доступа к внутреннему списку

Здесь я вызываю метод

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

Спасибо за помощь!Надеюсь, кто-нибудь сможет прояснить и дать мне инструкции о том, как я могу исправить это?Я немного растерялся.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Параллельное изменение Исключение возникает, когда коллекция изменяется между итерациями.Мы можем использовать ConcurrentHashMap или CopyOnWriteArrayList, чтобы преодолеть эту проблему.

Если задано исключение UnsupportedOperationException, измените ArrayList на LinkedList

0 голосов
/ 11 мая 2018

Может быть:

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

Когда вы создаете элемент, вы добавляете его в несколько списков.И когда один из них пытается изменить его, вы можете получить исключения.Поскольку в обоих списках используется один и тот же элемент, точно такой же.

Исправление, которое может помочь:

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

Просто создайте новый элемент для каждого списка и измените его по своему усмотрению.

Или создайте новый список для:

public void removeContainedItem(String containerName, String itemName){

И измените новый список копий с элементами, затем установите предыдущий список на измененный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...