Помогите Ошибка с .getScoreboardTags()

Статус
Закрыто для дальнейших ответов.

pro100koder

Активный участник
Пользователь
Баллы
76
В общем, вот ошибка
Код:
[10:55:35] [Server thread/WARN]: [PLUGIN] Task #24 for PLUGIN v1337 generated an exception
java.util.ConcurrentModificationException: null
    at java.util.HashMap$HashIterator.nextNode(Unknown Source) ~[?:1.8.0_172]
    at java.util.HashMap$KeyIterator.next(Unknown Source) ~[?:1.8.0_172]
    at game.start.Start(start.java:24) ~[?:?]
    at PLUGIN.main$1.run(main.java:22) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-596221b-9a1fc1e]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:353) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:738) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_172]
Та самая строка, на которую жалуется ошибка...
Код:
for(String o:global.getScoreboardTags()){
А теперь пояснение: global - entity (armorStand), в котором я привык хранить тэги и скорборды. Не надо разводить оффтоп по теме "в переменных надо всё хранить", я делаю так. Мне так удобнее. Лучше всё-же помогите избавиться от ошибки.
 
Возможно, ты редактируешь global.getScoreboardTags() в цикле? Попробуй iterator вызвать.
 
Возможно, ты редактируешь global.getScoreboardTags() в цикле? Попробуй iterator вызвать.
Охх... Сейчас понесутся шутки про первый класс... Что за iterator? Хотя, как я понял, можно тупо в массив запихать все тэги перед циклом, а в цикле уже использовать данные из массива...
 
Охх... Сейчас понесутся шутки про первый класс... Что за iterator? Хотя, как я понял, можно тупо в массив запихать все тэги перед циклом, а в цикле уже использовать данные из массива...
Ааа-нет. Не прокатил массив. Хотя я не в массив запихал, а в set, ну неважно.
 
Охх... Сейчас понесутся шутки про первый класс... Что за iterator? Хотя, как я понял, можно тупо в массив запихать все тэги перед циклом, а в цикле уже использовать данные из массива...
Что-то вроде этого, если память не изменяет.
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
while(iter.hasNext()){
    String s=iter.next();
    //todo
    //для удаления текущего элемента - iter.remove()
}
 
Что-то вроде этого, если память не изменяет.
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
while(iter.hasNext()){
    String s=iter.next();
    //todo
    //для удаления текущего элемента - iter.remove()
}
Код:
[11:57:29] [Server thread/WARN]: [TFShop] Task #188 for TFShop v1337 generated an exception
java.util.ConcurrentModificationException: null
    at java.util.HashMap$HashIterator.remove(Unknown Source) ~[?:1.8.0_172]
    at game.start.Start(start.java:31) ~[?:?]
    at tfshop.main$1.run(main.java:22) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-596221b-9a1fc1e]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:353) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:738) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_172]
А теперь код в студию:
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
        while(iter.hasNext()){
            String s=iter.next();
            global.removeScoreboardTag(s);
            iter.remove();
        }
Так-с... А жалуется на строчку iter.remove();...
 
Код:
[11:57:29] [Server thread/WARN]: [TFShop] Task #188 for TFShop v1337 generated an exception
java.util.ConcurrentModificationException: null
    at java.util.HashMap$HashIterator.remove(Unknown Source) ~[?:1.8.0_172]
    at game.start.Start(start.java:31) ~[?:?]
    at tfshop.main$1.run(main.java:22) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot.jar:git-Spigot-596221b-9a1fc1e]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:353) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:738) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot.jar:git-Spigot-596221b-9a1fc1e]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_172]
А теперь код в студию:
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
        while(iter.hasNext()){
            String s=iter.next();
            global.removeScoreboardTag(s);
            iter.remove();
        }
Так-с... А жалуется на строчку iter.remove();...
java.util.ConcurrentModificationException в частности возникает в случае, когда два потока одновременно модифицируют коллекцию или же просто во время итерации модифицируется коллекция (независимо от потоков). Вот у тебя как раз 2 случай. Ты во время итерации тегов удаляешь тег из коллекции. Так нельзя делать. Такая же ошибка и в for each, так как он тоже использует на деле тот же самый итератор. Мой вариант решения заключается в предварительном поверхностном копировании коллекции, а затем через ее итерацию удалять в основе:
Код:
Set<String> tags = new HashSet<>(global.getScoreboardTags());
for (String tag : tags) global.removeScoreboardTag(tag);

Либо же второй вариант:
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
while(iter.hasNext()) {
    iter.next();
    iter.remove();
}
Я не смотрел код removeScoreboardTag(...), возможно там что то полезное, потому предпочтительно использовать 1 вар.
 
java.util.ConcurrentModificationException в частности возникает в случае, когда два потока одновременно модифицируют коллекцию или же просто во время итерации модифицируется коллекция (независимо от потоков). Вот у тебя как раз 2 случай. Ты во время итерации тегов удаляешь тег из коллекции. Так нельзя делать. Такая же ошибка и в for each, так как он тоже использует на деле тот же самый итератор. Мой вариант решения заключается в предварительном поверхностном копировании коллекции, а затем через ее итерацию удалять в основе:
Код:
Set<String> tags = new HashSet<>(global.getScoreboardTags());
for (String tag : tags) global.removeScoreboardTag(tag);

Либо же второй вариант:
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
while(iter.hasNext()) {
    iter.next();
    iter.remove();
}
Я не смотрел код removeScoreboardTag(...), возможно там что то полезное, потому предпочтительно использовать 1 вар.
Я уже пробовал использовать 1 вар (когда писал про идею с массивом), ну попробую ещё раз... Что уж мне остаётся...
 
java.util.ConcurrentModificationException в частности возникает в случае, когда два потока одновременно модифицируют коллекцию или же просто во время итерации модифицируется коллекция (независимо от потоков). Вот у тебя как раз 2 случай. Ты во время итерации тегов удаляешь тег из коллекции. Так нельзя делать. Такая же ошибка и в for each, так как он тоже использует на деле тот же самый итератор. Мой вариант решения заключается в предварительном поверхностном копировании коллекции, а затем через ее итерацию удалять в основе:
Код:
Set<String> tags = new HashSet<>(global.getScoreboardTags());
for (String tag : tags) global.removeScoreboardTag(tag);

Либо же второй вариант:
Код:
Iterator<String> iter=global.getScoreboardTags().iterator();
while(iter.hasNext()) {
    iter.next();
    iter.remove();
}
Я не смотрел код removeScoreboardTag(...), возможно там что то полезное, потому предпочтительно использовать 1 вар.
Хмм.. Заработало! А проблема в том варианте была в том, что я не указал HashSet<>, как я понял... Ладно, спасибо, тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх