Ошибка ConcurrentHashMap и LibGDX Java

Хорошо, я только что получил странную ошибку, и я не знаю, связано ли это с версией Java, с исходным кодом или с моей машиной. (Сегодня я обновляю свою версию Java!)

До проблемы... Я пишу игру с Libgdx, до сих пор ничего особенного, просто стрельба и уничтожение объектов. Чтобы уничтожить объекты, я добавляю их в список CopyOnWriteArrayList, а после завершения работы с WorldLogic и EntityLogic я удаляю эти объекты (во избежание ошибок) — работает отлично.

Чтобы добавить объекты на сцену, в данном случае маркер, я вызываю метод, который добавляет BodyDef и FixtureDef в Hashmap, затем этот Hashmap повторяется, и тело создается из BodyDef и FixtureDef. Код:

public void createBodies() {
    for (ConcurrentHashMap.Entry<BodyDef, FixtureDef> entry: bodiesToCreate.entrySet()) {
        System.out.println("Key: "+entry.getKey()+", Value: "+ entry.getValue());
        myWorld.getWorld().createBody(entry.getKey()).createFixture(entry.getValue());
        bodiesToCreate.remove(entry);
    }
}

Напечатанные значения, например:

{com.badlogic.gdx.physics.box2d.BodyDef@509dd43b=com.badlogic.gdx.physics.box2d.FixtureDef@5810f29f}

Короче говоря: как только я нажимаю левую кнопку мыши, чтобы выстрелить, программа зависает, и я получаю этот журнал ошибок в консоли: Журнал ошибок на Pastebin

Я попытался отладить, что выглядит как эта промежуточная отладка. Обратите внимание на странное повторение this -> entry -> this -> entry -> this.... (выглядело бесконечно) Снимок экрана отладки< /а>

Я просто не достаточно опытен, чтобы понять, в чем проблема, поэтому я пошел сюда, чтобы попросить о помощи. Заранее спасибо ТАК!

С Уважением


person BrianBrain    schedule 12.08.2014    source источник
comment
Ну, у вас есть огромная строка кода. Почему бы вам не разбить его и не посмотреть, что работает неправильно? Посмотрите, правильно ли работает entry.key(). посмотрите, можете ли вы добавить такое приспособление, посмотрите, работает ли entry.getValue() и т. д.   -  person progrenhard    schedule 12.08.2014
comment
Я сделал именно это, значения, которые я добавляю, верны, и добавленное приспособление также используется правильно ... Работая над этой проблемой с 2 ​​дней, не могу ее решить.   -  person BrianBrain    schedule 12.08.2014
comment
Я полагаю, что это связано с библиотекой, которую вы используете, я не знаком с ней, но просто убедитесь, что вы кодируете ее стандарты использования? проверить code.google.com/p/libgdx/issues/detail? идентификатор=1730   -  person Dan    schedule 12.08.2014
comment
Как выглядит трассировка стека?   -  person progrenhard    schedule 12.08.2014
comment
Я не получаю трассировку стека, потому что ошибка возникает за пределами виртуальной машины Java (по крайней мере, это то, что мне говорит Java). Все, что у меня есть, это журнал ошибок, который я связал.   -  person BrianBrain    schedule 12.08.2014
comment
Ошибки в библиотеке box2d из Libgdx обычно возникают в результате многократного освобождения объектов или многократного повторного добавления одного и того же объекта.   -  person P.T.    schedule 13.08.2014
comment
Журнал ошибок, вероятно, должен быть частью вопроса. Однако соответствующая часть там Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j com.badlogic.gdx.physics.box2d.Body.jniCreateFixture(...). Похоже, это ошибка, похожая на ту, о которой сообщалось на badlogicgames.com/ forum/viewtopic.php?t=15752&p=68074 , но это был только один из первых результатов веб-поиска (я еще не видел код этого метода, но он может дать некоторые идеи)   -  person Marco13    schedule 13.08.2014
comment
Безопасно ли удалять элемент из хэш-карты во время его повторения? Почему бы просто не очистить хэш-карту после завершения цикла?   -  person iforce2d    schedule 13.08.2014
comment
Это так, поскольку это concurrentHashmap. Я только что решил проблему, она была связана с глючным спавнкодом. Я исправил это с помощью подхода, который я упомянул здесь а>   -  person BrianBrain    schedule 13.08.2014