Java:迭代BiMap - 让我遇到一些问题

时间:2011-10-14 20:40:51

标签: java exception hashmap guava minecraft

Java编程

迭代我的地图的问题

Iterator<Player> iterator = plugin.inreview.keySet().iterator();
while (iterator.hasNext()) {
    Player key = (Player) iterator.next();
    chat.getRecipients().remove(key);
}

这引发:

java.util.NoSuchElementException 
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)

有关为何发生这种情况的任何想法?发生这种情况时,地图中有一个键(带有一个值)。

此外,它曾经工作到最近,我已经在我的Java文件上做了很多工作,我无法找出导致这种情况发生的原因。迭代这个地图时,我不能做任何循环,这会让事情变得复杂!

注意:

  • Chat.getRecipients()plugin.inreview
  • 不同
  • 过去工作得很好
  • 这是HashBiMap

请给我任何你可能有的提示和想法。

额外详情:

java.util.NoSuchElementException
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at java.util.HashMap$EntryIterator.next(Unknown Source)
    at com.google.common.collect.AbstractBiMap$EntrySet$1.next(AbstractBiMap.java:314)
    at com.google.common.collect.AbstractBiMap$EntrySet$1.next(AbstractBiMap.java:306)
    at me.geekplaya.Judge.JudgeQuit.onPlayerQuit(JudgeQuit.java:25)
    at org.bukkit.plugin.java.JavaPluginLoader$2.execute(JavaPluginLoader.java:251)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:339)
    at net.minecraft.server.ServerConfigurationManager.disconnect(ServerConfigurationManager.java:159)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:650)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:231)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:92)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:108)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:471)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:374)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:417)

1 个答案:

答案 0 :(得分:1)

如果remove调用正如你所说,不在迭代序列上运行那么必须有另一个线程更新plugin.inreview

检查plugin.review的所有写访问器,并确保在线程正在使用此代码读取时不能进行并发更新。

请注意,这样的错误很长时间都无法显示,然后由于其他影响线程时序的更改而突然变成严重问题。