# Problem bei LinkedList / JPanel



## TheListener (27. Feb 2012)

Hey!
Ich versuche seit einigen Wochen ein kleines Spiel zu programmieren, jedoch haben sich zwei Probleme eingeschlichen die ich nun seit längerer Zeit nicht beheben kann.

Zuerst habe ich ein Problem was glaube ich auf das 'JPanel' zurückzuführen ist. Total zufällig beim Start des Programms kann es passieren, das das gesamte Bild einfach weiß bleibt und sich das Programm scheinbar aufhängt, etwa wie ein Bluescreen, nur in weiß. Im Output-Fenster von Netbeans wird nicht einmal irgend eine Fehlermeldung ausgegeben und man kann das Fenster nur noch über den Stop-Button beenden. Exakt diesen Fehler hatte ich bei mehreren Projekten die grafische Dinge darstellten.
Vielleicht hatte jemand dieses Problem schon.

Zweitens habe ich ein Problem mit einer LinkedList. Diese verwaltet alle Spielobjekte und heißt 'GameObjects'. Merkwürdigerweise habe ich manchmal während des Spiels Exceptions, und zwar folgende:


```
java.lang.NullPointerException
	at java.util.LinkedList.node(LinkedList.java:575)
	at java.util.LinkedList.get(LinkedList.java:475)
	at GeneralUtil.Groupfunctions.isUnitinRange(Groupfunctions.java:146)
	at GameObjects.Beatle.update(Beatle.java:108)
	at Engine.Map.updateGameObjects(Map.java:322)
	at Engine.Map.update(Map.java:210)
	at Engine.Map_Desert.update(Map_Desert.java:107)
	at Engine.Engine.update(Engine.java:130)
	at Engine.Engine.run(Engine.java:80)
	at java.lang.Thread.run(Thread.java:722)
```

Die Zeile 'at GeneralUtil.Groupfunctions.isUnitinRange(Groupfunctions.java:146)' sieht wie folgt aus:


```
for(int i=0;i<List.size();i++)
            {
                try
                {
                    GameObject temp = (GameObject)List.get(i);//Diese Zeile hier

                    if(isAlly==true)if(isAlly(pu,temp)==false)continue;
                    if(isAlly==false)if(isAlly(pu,temp)==true)continue;

                    if(isNeutral==true)if(temp.isNeutral()==false)continue;
                    if(isNeutral==false)if(temp.isNeutral()==true)continue;

                    if(isAttackable==true)if(temp.isAttackable()==false)continue;
                    if(isAttackable==false)if(temp.isAttackable()==true)continue;

                    if(distancebetween(u.getX(),u.getY(),temp.getX(),temp.getY())<range)
                    {
                        b = true;
                    }       
                }
                catch(Exception e)
                {
                    System.out.println("function 'isUnitinRange'");
                    e.printStackTrace();
                }
            }
```

Das Problem ist nur das dieser Fehler nicht immer Auftritt und ich nicht weiß wie ich ihn beheben kann.
Würde mich über Hilfe freuen.

MfG

TheListener


----------



## SlaterB (27. Feb 2012)

> Total zufällig beim Start des Programms kann es passieren, das das gesamte Bild einfach weiß bleibt und sich das Programm scheinbar aufhängt, etwa wie ein Bluescreen, nur in weiß.

eine Möglichkeit wäre ein zu frühes setVisible(true), sollte der letzte Befehl zur GUI beim Start sein

-----

Datenänderungen aus parallelen Threads, die die GUI betreffen, sollten in SwingUtilities.invokeLater() stehen,
falls dir das nichts sagt kann man das bestimmt nachschlagen,
wichtig: nicht zuviel dort hinein, Daten parallel berechnen, solange es ungefährlich ist, 
die ms der Übertragung in GUI-Datenbestände synchronisiert ausführen,

Problem ist nämlich wahrscheinlich, dass die GUI gleichzeitig auf die Daten zugreift und sich darauf verläßt,
dass etwa zwischen einer size()-Abfrage und einer Schleife danach kein Element gelöscht wird


----------



## TheListener (27. Feb 2012)

Wow, vielen Dank! Das Whitescreen Problem sofort behoben : )
Mache mich mal an die Sache mit dem Thread, wenn ich nicht weiterkomme melde ich mich nochmal : )
Danke!


----------



## TheListener (2. Mrz 2012)

Soo, habe nun nochmal meinen Code durchsucht und es läuft nur ein Thread, die Hauptspielschleife.



> Problem ist nämlich wahrscheinlich, dass die GUI gleichzeitig auf die Daten zugreift und sich darauf verläßt, dass etwa zwischen einer size()-Abfrage und einer Schleife danach kein Element gelöscht wird



Genau das dachte ich mir auch. Aber wenn ich nur einen Thread habe, was genau behindert diesen dann?
Beziehungsweise was genau verändert zwischendurch die Listenelemente?

Lasse momentan alles von der run() Methode meines Hauptthreads aktualisieren. Sollte ich den Teil dann in SwingUtilities.invokeLater() packen?


----------



## SlaterB (2. Mrz 2012)

die GUI ist immer ein eigener Thread, und deiner stört eben,

> Sollte ich den Teil dann in SwingUtilities.invokeLater() packen? 

wenn dir eine Wiederholung meiner schon klaren Aussage hilft: ja
(irgendeinen Teil, welchen ist nicht pauschal zu sagen, wie auch schon geschrieben kann man leicht zu viel nehmen)


----------

