Java: итерация BiMap - вызывает у меня некоторые проблемы - PullRequest
1 голос
/ 15 октября 2011

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)

1 Ответ

1 голос
/ 15 октября 2011

Если вызов remove, как вы говорите, не работает с повторяющейся последовательностью, тогда должен быть другой поток, обновляющий plugin.inreview.

Проверьте все средства доступа для записи plugin.review и убедитесь, что одновременное обновление невозможно, пока поток читает с использованием этого кода.

Обратите внимание, что такая ошибка может не проявляться в течение длительного времени, а затем внезапно стать серьезной проблемой из-за изменений в другом месте, которые влияют на синхронизацию потоков.

...