Spontane NullPointerExceptions

Started by Melfis, February 20, 2011, 09:59:12 PM

Previous topic - Next topic

Melfis

Hallo,
bekomme immer wieder den fehler:

Exception in thread "main" java.lang.NullPointerException
   at com.threed.jpct.Object3D.transformVertices(Unknown Source)
   at com.threed.jpct.World.renderScene(Unknown Source)
   at GUI.J3D.JPanel3D.loop(JPanel3D.java:102)
   at GUI.MainFrame.<init>(MainFrame.java:158)
   at Cuby.Starter.main(Starter.java:146)

Der fehler kommt spontan, und unregelmäßig,
ich hab keinen blassen schimmer wieso..
bitte um schnelle hilfe, jpct ist teil meiner bachlorarbeit die ich in einer woche abgeben muss :'(

MFG Melfis

MFG Melfis

EgonOlsen

Vermutlich machst du irgendwas mit der World in einem anderen Thread als dem Rendering-Thread. Wie auch Swing ist jPCT nicht threadsicher. Es ist nicht gut, wenn du z.B. Objekte zu einer Welt ergänzt/entfernst, wenn du nicht im Renderthread bist. Der AWT Event Dispatch Thread ist ein beliebter Kandidat dafür, also Mouse- und Keylistener. Entweder setzt du dort nur ein Flag und machst die Arbeit im Renderthread oder du musst ein paar synchronized ergänzen. Das ist weniger schön, hilft aber schneller. Mehr Infos: http://www.jpct.net/wiki/index.php/Multithreading#Thread_safety

Melfis

wow, die antwort war schnell,

hab das problem jetzt raus, zum nächsten :)

Exception in thread "main" java.lang.NullPointerException
   at com.threed.jpct.World.renderScene(Unknown Source)
   at GUI.J3D.JPanel3D.render(JPanel3D.java:374)
   at GUI.J3D.JPanel3D.loop(JPanel3D.java:102)
   at GUI.MainFrame.<init>(MainFrame.java:158)
   at Cuby.Starter.main(Starter.java:146)

der aufruf ist jedeoch syncron:

private synchronized void render(){
      if (buffer.isInitialized()) {
         world.renderScene(buffer);
         buffer.clear(Database.ProgEinst.background3d); // Hintergrundfarbe
         world.draw(buffer);
         buffer.update();
         if (!isPause()) buffer.display(jp.getGraphics());

      }
   }

mfg

EgonOlsen

Gleiche Ursache. Du hast jetzt diese eine Methode synchronized, aber das nutzt ja nichts, wenn andere es nicht auch sind. Ich muss jetzt raten, weil ich deinen Code nicht kenne, aber setze mal um alle Codeblöcke die in irgendwelchen Threads oder Listenern an jPCT-Objekten rumfummeln ein synchronized(this) {...}.

EgonOlsen

P.S.: Wie und wo rufst du die render()-methode denn auf?

Melfis

Nur einmal, hab jetzt bischen rumprobiert,
die Fehler scheinen weg zu sein.

Hab jetzt bei jeder Methode die .addObject3D oder remove  aufruft ein Syncro reingepackt.
Ich könnte doch auch World Überschreiben und .addObject3D und remove() syncron überschreiben, oder?

So, da der fehler behoben ist, will ich mich mal um mein Verständnis des Problems kümmern.

renderScene greift auf ein FrameBuffer zu, dieser ist initialisiert und
es erfolgt kein Zugriff von außen auf den Buffer,
damit ist der Buffer ja unberuht.
d.h. die Referenz geht innerhalb von renderScene verloren oder?

Achja, hab ich in der Aufregung total vergessen:
vielen danke für JPCT und den Support den du leistest!  :D

MFG Melfis

PS.: Deiner Homepage fehlt ein Donate Button :P




EgonOlsen

Das Problem ist die Liste mit Objekten der World. Wenn du die änderst während renderScene() sie durchläuft (z.B. durch ein add oder remove), dann passieren allerlei lustige Dinge, die sich meistens als Nullpointer äußern. Mit dem FrameBuffer hat das nichts zu tun.

EgonOlsen

Was den Donate-Button angeht...ich bin zufrieden, wenn ich deine Arbeit nach Fertigstellung mal anschauen könnte. Wofür genau nutzt du jPCT denn da?

Melfis

#8
Ist ein Statikprogramm,
es berechnet die Kräfte sowie Verformungen die in einem Aussteifungsobjekt, z.B. einer Betonwand, entstehen wen eine Last,
z.B. Wind, auf ein Gebäude trifft.

JPCT nutze ich um das ganze zu Visualisieren und dem nutzer eine intuitiv Eingabe zu ermöglichen

MFG