Java 删除项时Arraylist迭代器并发修改异常

Java 删除项时Arraylist迭代器并发修改异常,java,exception,arraylist,iterator,Java,Exception,Arraylist,Iterator,所以这个问题与我在这里发现的关于修改列表时并发异常的其他问题有点不同,因为当我修改列表中某个对象的内部列表时会发生这种情况。这是访问内部列表的唯一方法 这里是我调用方法的地方 public void interactWithItem(int targetIDX, int targetIDY){ for(Iterator<Item> it = listOfAllItems.iterator(); it.hasNext();){ Item tempItem = i

所以这个问题与我在这里发现的关于修改列表时并发异常的其他问题有点不同,因为当我修改列表中某个对象的内部列表时会发生这种情况。这是访问内部列表的唯一方法

这里是我调用方法的地方

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();
                }
            }
        }
    }
}
谢谢你的帮助!希望有人能澄清,并给我指示,我可以如何着手解决这个问题?我有点不知所措

可能是:

**Item tItem = tempIt.next();**
创建项目时,您可以将其添加到多个列表中。当其中一个试图修改它时,您可能会得到异常。因为bouth列表使用相同的项,完全相同

可能有帮助的修复方法是:

Item newItem = new Item();
newItem  = tempIt.next();
只需为每个列表创建新项目,并根据需要修改它们

或为以下内容创建新列表:

public void removeContainedItem(String containerName, String itemName){

并使用项修改新的副本列表,然后将“上一个列表”设置为“已修改的列表”。

在迭代之间修改集合时,会发生并发修改异常。我们可以使用ConcurrentHashMap或CopyOnWriteArrayList来解决这个问题


如果点击UnsupportedOperationException,将ArrayList更改为LinkedList

,以获得更好的帮助帖子,我们实际上可以在IDE上运行和调试该问题。使用CopyOnWriteArrayList声明您的列表ex:CopyOnWriteArrayList listOfItems=new CopyOnWriteArrayList。。它应该可以工作什么是listOfAllItems?一个包含项对象的ArrayList,每个对象都有其包含项的内部arraylist@JavaLearner1我会试试,我会让你知道它是否有效。@Frost当然,请让我知道它已经修复了,谢谢-这不是问题所在,但这些都是一些好主意,供人们尝试处理相同的问题。谢谢你的意见