NullPointer Exception

philS

Neues Mitglied
Hallo zusammen,

das ist dann wohl mein erster Thread / Beitrag hier ;-)

Ich fange gerade mit JAVA an. Komme ursprünglich von PHP. Ich fange also nicht ganz bei Null an und habe schon Vorkenntnisse.

Also zu meinem Problem / Frage. Ich würde gerne zu Übungszwecken eine kleine Server / Client Anwendung machen und stoße da auf Fehler.
Ich habe eine Klasse, die den Server bereitstellt. ( Normaler ServerSocket wartet auf eingehende Verbindungen )
Eine Andere ist der "Client". Generell klappt auch alles, wenn ich in der Clientklasse selber Daten abschicke kommt auch alles korrekt zurück.
Da das ganze aber mit einer GUI versehen werden soll kommt hier ein Fehler.

Ich rufe also aus einer anderen Klassen den Client auf und verbinde mich mit dem Server (Klappt)
Ich starte die Clientklasse in einem eigenen Thread. ( Klappt )
Wenn ich dann aber von meiner GUI-Klasse aus eine Nachricht schreiben will, bekomme ich immer eine NullPointer Exception. Ich habe schon den halben Tag gesucht woran es liegen könnte. Vielleicht kann mir ja jemand einen Tipp geben 🙂

Code "Client"

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Arbeiter implements Runnable {

	public BufferedWriter writer;
	
	public void schreibeNachricht() throws IOException {
		writer.write("Test\n");
		writer.flush();
	}
	
	@Override
	public void run() {
		try {
			// SOCKET VERBINDEN
			Socket client = new Socket("localhost", 1234);
			
			// INPUTSTREAM
			InputStream in = client.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			
			// OUTPUTSTREAM
			OutputStream out = client.getOutputStream();
			writer = new BufferedWriter(new OutputStreamWriter(out));

			// RUN
			String s = null;
			while((s = reader.readLine()) != null) {
				System.out.println(s);
			}
			
			// CLOSE
			writer.close();
			reader.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Code "GUI-Klasse"

Java:
import java.io.IOException;

public class ThreadTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		Arbeiter test = new Arbeiter();
		Thread erster = new Thread(test);
		erster.start();
		test.schreibeNachricht();
		
	}

}

Der Fehler:

Java:
Exception in thread "main" java.lang.NullPointerException
	at worker.Arbeiter.schreibeNachricht(Arbeiter.java:18)
	at worker.ThreadTest.main(ThreadTest.java:17)
 
Zuletzt bearbeitet von einem Moderator:
schreibeNachricht() greift auf writer zu, warum sollte das deiner Meinung nach nicht null sein?
weil es in der run-Methode gesetzt wird?
das läuft doch aber extra nebenläufig in einem Thread ab, du kannst doch gar nicht wissen, wann das zeitlich bereit ist,

versuche mal Thread.sleep(1000) in der main-Methode dazwischen, warte eine Sekunde
 
Nachdem du erster.start(); aufgerufen hast wird die run() Methode von Arbeiter parallel (mehr oder weniger) zum restlichen Code ausgeführt. Daher ist der BufferedWriter in der Klasse Arbeiter zum Zeitpunkt des Aufrufes von schreibeNachricht() noch nicht initialisiert.
 
Danke für die Antwort! Hat geklappt!
Ist das so auch der normale Weg wenn man mit Threads arbeitet? Den Thread kurz sleepen?
 
Ne. Der Socket wird von einen Thread (besser nicht EDT, was zu Verzögerungen in GUI etc führen kann) aufgebaut, bevor überhaupt versucht wird zu senden. Oder Arbeiter enthält eine Collection die die Strings zwischenspeichert und absendet sobald eine Verbindung besteht. Macht aber eher nur Sinn, wenn Verbindungen oft ab- und wieder aufgebaut werden. Oder der eine Thread wird blockiert, sofern derzeit kein avaibler Writer existiert. Darauf würde ich aber ebenfalls verzichten, jede Blockierung enthält entfernt eine Möglichkeit auf Dead Lock.
 
Zuletzt bearbeitet:
Du konstruierst einfach eine neue Klasse, die das Verbinden zum Socket etc übernimmt, aber nicht in einem Thread gestartet wird.
Nur das Lesen muss i.d.R. in einem eigenen Thread abgewickelt werden.
 
Du konstruierst einfach eine neue Klasse, die das Verbinden zum Socket etc übernimmt, aber nicht in einem Thread gestartet wird.
Nur das Lesen muss i.d.R. in einem eigenen Thread abgewickelt werden.

I/O-ops sollten grundsätzlich in einen eigenen Thread ausgelagert werden ... dazu gehört auch das schreiben auf einen socket ... da niemand weis wie viel zeit dies in anspruch nimmt ... *wenn man z.b. ein paar MB schreiben will ... zusätzlich noch verschlüsselt ... da kommt schon mal etwas zusammen was die GUI freezed ...

read() wird desshalb extra behandelt da read() in der regel blockiert *sofern man nicht mit NIO/AIO arbeitet* ... und es einem da halt sofort ins auge fällt ...
 

Neue Themen


Zurück
Oben