1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем pro100koder, 14 сен 2018.

Статус темы:
Закрыта.
  1. Автор темы
    pro100koder

    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), в котором я привык хранить тэги и скорборды. Не надо разводить оффтоп по теме "в переменных надо всё хранить", я делаю так. Мне так удобнее. Лучше всё-же помогите избавиться от ошибки.
     
  2. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Возможно, ты редактируешь global.getScoreboardTags() в цикле? Попробуй iterator вызвать.
     
  3. Автор темы
    pro100koder

    pro100koder Активный участник Пользователь

    Баллы:
    76
    Охх... Сейчас понесутся шутки про первый класс... Что за iterator? Хотя, как я понял, можно тупо в массив запихать все тэги перед циклом, а в цикле уже использовать данные из массива...
     
  4. Автор темы
    pro100koder

    pro100koder Активный участник Пользователь

    Баллы:
    76
    Ааа-нет. Не прокатил массив. Хотя я не в массив запихал, а в set, ну неважно.
     
  5. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Что-то вроде этого, если память не изменяет.
    Код:
    Iterator<String> iter=global.getScoreboardTags().iterator();
    while(iter.hasNext()){
        String s=iter.next();
        //todo
        //для удаления текущего элемента - iter.remove()
    }
     
  6. Автор темы
    pro100koder

    pro100koder Активный участник Пользователь

    Баллы:
    76
    Код:
    [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();...
     
  7. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    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 вар.
     
  8. Автор темы
    pro100koder

    pro100koder Активный участник Пользователь

    Баллы:
    76
    Я уже пробовал использовать 1 вар (когда писал про идею с массивом), ну попробую ещё раз... Что уж мне остаётся...
     
  9. Автор темы
    pro100koder

    pro100koder Активный участник Пользователь

    Баллы:
    76
    Хмм.. Заработало! А проблема в том варианте была в том, что я не указал HashSet<>, как я понял... Ладно, спасибо, тема закрыта.
     
Статус темы:
Закрыта.

Поделиться этой страницей