gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:15:47 25 4
gpt4 key购买 nike

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

这是我调用该方法的地方

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

关于java - Arraylist迭代器删除项时并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50290104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com