1

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 文件上做了很多工作,以至于我无法找出导致这种情况发生的原因。迭代这张地图时,我不能做任何 while 循环,这会使事情变得复杂!

笔记:

  • 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)
4

1 回答 1

1

如您所说,如果remove调用不是对迭代序列进行操作,则必须有另一个线程正在更新plugin.inreview

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

请注意,这样的错误可能会在很长一段时间内无法显现,然后由于影响线程计时的其他地方的变化而突然变成一个严重的问题。

于 2011-10-14T20:46:23.657 回答