首页 > 解决方案 > 来自带有列表的 hasmap 的 ConcurrentModificationException

问题描述

好吧,我正在尝试解决这个问题。我有一个

ConcurrentHashMap< UUID, Object > 市场 = new ConcurrentHashMap();

对象包含:库存库存;这是另一个对象。

所以我试图删除该库存拥有的观众列表。

这是我尝试过的:

for(Iterator<HumanEntity> iter = markets.get(p.getUniqueId()).getInv().getViewers().iterator(); iter.hasNext(); ) {

            HumanEntity student1 = iter.next();
            Player student = (Player) student1;
            if(student.getOpenInventory() != null) {
                student.closeInventory();
                student.sendMessage(Configuration.Msg_Shop_Closed() );
    }

}   

getViewers() 返回查看者列表:https ://imgur.com/pi1ecD1

这是我得到的错误

org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.EntityLiving.mount(EntityLiving.java:1717) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.EntityPlayer.mount(EntityPlayer.java:595) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.EntityHuman.ak(EntityHuman.java:347) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.World.entityJoinedWorld(World.java:1605) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.World.g(World.java:1582) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.World.entityJoinedWorld(World.java:1652) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.World.g(World.java:1582) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.World.tickEntities(World.java:1425) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.WorldServer.tickEntities(WorldServer.java:597) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:786) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot-1.8.8.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_191]
Caused by: java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_191]
        at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_191]

标签: pluginsminecraftbukkitjava.util.concurrent

解决方案


没关系,我解决了,对于以后需要这个的你们,答案是这样的:


Iterator<Seller> it = markets.values().iterator();

        while(it.hasNext()){    

        List<HumanEntity> buyer  = it.next().getInv().getViewers();

        Iterator<HumanEntity> it2 = buyer.iterator();
        HumanEntity buyer1 = it2.next();
            if( buyer1.getOpenInventory() != null) {
                buyer1.closeInventory();
            }
        }


推荐阅读