ProcessMessage NullPointerException

Brom

Mitglied
Hallo, ich bin gerade dabei, ein kleines Client-Server Programm zu schreiben, bei dem in einer GUI in einer JTextArea die Ausgaben des Servers stehen sollen.
Dabei bekomme ich aber immer eine NullPointerException als Fehlermeldung.
Hier der Quellcode und die Fehlermeldung:

Deklarieren:
Java:
JTextArea ausgeben=new JTextArea();

Ändern des Textes:
Java:
 public void processMessage(String message){
        String[] nachrichtTeil=message.split(":"); 

        if(message!=null){
            ausgeben.setText(message);
        }
}

Die Fehlermeldung lautet:
Exception in thread "Thread-16" java.lang.NullPointerException
at BestellenGui.processMessage(BestellenGui.java:53)
at Client$Clientempfaenger.run(Client.java:62)

Vielen Dank schon mal im Vorraus und bitte helft mir dieses Problem zu lösen.
 
Ist vllt message=null? Dann wirft das #split die NPE, und zu dem if kommt es erst garnicht.

Um mehr sagen zu können, müsste man mehr Code sehen
 
Ist jetzt ein sehr kleiner Codeausschnitt, aber vielleicht liegt es daran, dass du ein split auf einen eventuell null-String machst.
Pack den split doch mal in die if-Abfrage und prüfe ob die Nullpointer immernoch fliegt.

Gruß
Luk
 
@KaffeeFan

Die Methode wird ja nur aufgerufen, wenn der Server eine Nachricht an den Client sendet, also kann message ja gar nicht null sein.

Und der gibt mir den Fehler in der Zeile mit dem
Java:
ausgeben.setText(message);
aus.
Aber danke für den Tipp und ich probiere es mal aus.
 
Dann wird deine JTextArea nicht initialisiert sein.

Kann es sein das du eine Instanzvariable ausgeben deklarierst, deine Initialisierung welche du im Anfangspost gezeigt hast aber im Konstruktor oder einer Methode steht? Dann liegt dort nämlich der Fehler: du initialisierst eine lokale Variable ausgeben, die Instanzvariable bleibt uninitialisiert.
 
Wenn ich aber im Konstruktor hingehe und ausgeben.setText("Hallo Welt"); mache, dann funktioniert das, nur in der methode processMessage nicht.
Im Anhang ist das Projekt, für die die mal einen Blick drauf werfen wollen.
Das steht in der Klasse BestellenGui.
Zum starten des Server die Klasse "ServerGui" ausführen und der Client ist die Klasse "ShopGui".
 

Anhänge

Dann wird deine JTextArea nicht initialisiert sein.

Kann es sein das du eine Instanzvariable ausgeben deklarierst, deine Initialisierung welche du im Anfangspost gezeigt hast aber im Konstruktor oder einer Methode steht? Dann liegt dort nämlich der Fehler: du initialisierst eine lokale Variable ausgeben, die Instanzvariable bleibt uninitialisiert.


Die TextArea wird noch vor dem Konstruktor deklariert, also gilt das ja für die ganze Klasse.
 
Wie gesagt war nur eine Vermutung, hatten ähnliche Probleme schon öfters 😉

Der Code schaut eigentlich richtig, aus würde keinen Grund für eine NPE sehen.
 
Trotzdem danke für den Tipp 😀

Wir haben das Projekt "Tshirt-Server2 im Informatik-Unterricht bearbeitet und da ich alles fertig hatte sollte ich eine GUI dazu erstellen.
Dann bin ich auf dieses Problem gestoßen und habe meinen Info-Lehrer gefragt, der hat aber auch keine Idee, woran das liegen könnte... 🙁



Und wenn ich hingehe, und das
Java:
ausgeben.setText(message)
durch
Java:
ausgeben.setText("irgendein Text ")
ersetze, dann funktioniert das.
 
Zuletzt bearbeitet:
Hab mir deinen Code nochmals angeschaut und den Fehler gefunden.

Die Initialisierung deiner JTextArea passt zwar theoretisch, aber leider wird die Methode processMessage aufgerufen noch bevor die Initialisierung abgeschlossen wurde.
Ursache: Es wird zwar der Konstruktor der Klasse BestellenGui als erstes aufgerufen, aber vor den Initialisierungen noch die Konstruktoren der Superklassen aufgerufen und abgearbeitet.
Und in der Basisklasse Client erstellst du einen ClientEmpfänger welcher sofort gestartet wird und processMessage aufruft.

Lösung: Schreibe für die JTextArea ein get-Methode, sofern die Variable noch nicht initialisiert wurde erstellst du ein neues Objekt ansonsten gibst du das vorhandene zurück

Java:
JTextArea ausgeben;

public JTextArea getAusgeben() {
    if(ausgeben == null) {
         ausgeben = new JTextArea();
    }
    return ausgeben;
}

EDIT: Das ist auch einer der Gründe warum in einem Konstruktor wirklich nur Initialisierungen stehen sollten und wirklich verarbeitende Sachen erst durch eine weitere Methode aufgerufen werden sollten.
 
OK, ich werde das mal versuchen, wenn ich dann immer noch Probleme habe melde ich mich noxh mal, aber ich gehe stark davon aus, dass das das Problem ist.
Vielen dank für eure Mithilfe an alle, die mir geholfen haben. 😀
Danke
 
Habe es jetzt ausprobiert und es funktioniert einwandfrei.
Vielen vielen Dank nochmal für alle Hilfe, die ich bekommen habe und die Vorschläge.
Brom
 

Zurück
Oben