Грешка в Java на ConcurrentHashMap и LibGDX

Добре, току-що получих странен бъг и не знам дали е свързан с версията на 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}

Накратко: Веднага щом щракна с левия бутон на мишката, за да снимам, програмата замръзва и получавам този регистър на грешките в конзолата: Errorlog на Pastebin

Опитах се да отстраня грешки, което изглежда като това средно отстраняване на грешки. Забележете странното повторение на това -> запис -> това -> запис -> това .... (изглеждаше безкрайно) Екранна снимка за отстраняване на грешки

Просто нямам достатъчно опит, за да разбера какъв е проблемът, затова отидох тук, за да помоля за помощ. Благодаря предварително SO!

за разбирането


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? id=1730   -  person Dan    schedule 12.08.2014
comment
Как изглежда проследяването на стека?   -  person progrenhard    schedule 12.08.2014
comment
Не получавам stacktrace, защото грешката се случва извън java VM (поне това ми казва 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
Безопасно ли е да премахнете елемент от hashmap, докато итерирате върху него? Защо просто не изчистите hashmap след приключване на цикъла?   -  person iforce2d    schedule 13.08.2014
comment
Така е, тъй като това е едновременна Hashmap. Току-що реших проблема, имаше нещо свързано с бъги spawncode. Поправих го с подхода, който споменах тук връзка   -  person BrianBrain    schedule 13.08.2014