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)

なぜこれが起こっているのかについてのアイデアはありますか? これが発生すると、マップには 1 つのキー (1 つの値を持つ) が存在します。

また、最近まで機能していましたが、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呼び出しが反復シーケンスで動作していない場合は、別のスレッド update が必要plugin.inreviewです。

のすべての書き込みアクセサーをチェックplugin.reviewし、スレッドがこのコードを使用して読み取りを行っている間、同時更新が不可能であることを確認してください。

このようなバグは長い間マニフェストに失敗し、スレッドのタイミングに影響を与える他の場所の変更により、突然深刻な問題になる可能性があることに注意してください。

于 2011-10-14T20:46:23.657 に答える