# Problem bei Outputstreamerzeugung in anderer Klasse als Socket



## iChaos (5. Okt 2010)

Hi zusammen

Die Klasse ClientNetwork erzeugt ein Socket und verbindet sich mit dem Server. Anschliessend schickt der Server ein DefaultListModel, welches dann im Gui vom Client angezeigt wird -  funktioniert einwandfrei! Damit das Gui von Server/Client getrennt ist(so lautet die Vorgabe), habe ich eine getMethode für das Socket erstellt, damit ich es in der nächsten Klasse verwenden kann.



```
public class ClientNetwork implements Runnable {

	private Socket clientSocket;
	
	private InputStream inputStream;
	private ObjectInputStream objectInputStream;
	private DefaultListModel listModelFiles;
	private JList listFiles;

	public ClientNetwork(JList listFiles,DefaultListModel listModelFiles) {
		
		this.listModelFiles = listModelFiles;
		this.listFiles = listFiles;

		new Thread(this).start();
	}

	public void run() {
		
		try {
			clientSocket = new Socket("localhost",4444);
			inputStream = clientSocket.getInputStream();
			objectInputStream = new ObjectInputStream(inputStream);
			listModelFiles = (DefaultListModel) objectInputStream.readObject();
			listFiles.setModel(listModelFiles);
			
		} catch (ClassNotFoundException cnfe) {
				cnfe.printStackTrace();
		} catch (UnknownHostException uhe) {
				uhe.printStackTrace();
		} catch (IOException ioe) {
				ioe.printStackTrace();
		}
	}

	public Socket getClientSocket() {
		return clientSocket;
	}
}
```

Der FileLoader wird aufgerufen, wenn ich einen Button vom ClientGui drücke - funktioniert ebenfalls einwandfrei. Sobald ich aber einen Outputstream erzeugen will, schiesst es mir einen Nullpointer um die Ohren. Das Socket und die Klassenvariabel clientNetwork wurden vorher mit Syso's und if's auf null geprüft und es sind beide nicht null... *Weswegen ich keinen Plan habe, wieso der Outputstream null ist... *


```
public class FileLoader implements Runnable {

	private JList listFiles;
	private DefaultListModel listModelFiles;
	private ClientNetwork clientNetwork;
	private Socket clientSocket;
	private OutputStream outputStream;
	private DataOutputStream dataOutputStream;

	public FileLoader(JList listFiles, DefaultListModel listModelFiles) {

		this.listFiles = listFiles;
		this.listModelFiles = listModelFiles;
		
		new Thread(this).start();
	}

	public void run() {
		
		clientNetwork = new ClientNetwork(listFiles, listModelFiles);
		clientSocket = clientNetwork.getClientSocket();
		
		try {
			outputStream = clientSocket.getOutputStream();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

		try {
			dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
}
```

Wer kann mir helfen?


----------



## SlaterB (5. Okt 2010)

> Das Socket und die Klassenvariabel clientNetwork wurden vorher mit Syso's und if's auf null geprüft und es sind beide nicht null... 

im ganzen Programm ist kein if vorhanden, wovon fantasierst du? 

> Zeile 20: clientNetwork = new ClientNetwork(listFiles, listModelFiles);
> Zeile 21: clientSocket = clientNetwork.getClientSocket();

in Zeile 20 wird nur ein Thread gestartet, bis der einen Socket zur Verfügung stellt, dauert es nebenläufig ca. 5 ms (ausgedacht)
du fragst aber direkt in der nächsten Zeile, nur 5 ns später, bereits den Socket ab, da ist der aber noch null

setze Thread.sleep(100); dazwischen, 100 ms warten, dann dürfte der Socket da sein,
sauberer wäre, vom Thread-run aus weiterzumachen oder notfalls eine Schleife mit sleep bis socket != null


----------



## iChaos (5. Okt 2010)

Die Syso's und if's habe ich rausgenommen!

Finde deinen Lösungsansatz gut, doch es liegt nicht an der Zeit. Habe beide Vorschläge probiert, sehe jetzt gerade dass das Socket null ist...


----------



## iChaos (5. Okt 2010)

Scheinbar funktioniert es, es wirft mir jedenfalls keinen Null Pointer mehr... Frag mich nicht wieso, aber thx


----------



## iChaos (5. Okt 2010)

Habs nach näherem Anschauen herausgefunden(denk ich mal), es lag am Thread in der Network-Class, dort fehlte eine while-Schleife die den Thread am laufen hält, da er nach dem Versenden des ListModels zu Ende ist.

ist meine Erkenntnis richtig so?


----------



## SlaterB (5. Okt 2010)

dass die run-Methode beendet wird, sollte keine Auswirkung darauf haben, ob die clientSocket-Variable im ClientNetwork-Objekt null ist oder nicht, nein,
einmal gesetzt, bleibt die Variable != null genau bis sie auf null gesetzt wird, eine sonstige Magie gibt es nicht,

das ClientNetwork-Objekt an sich verschwindet irgendwann, wenn es von nirgendwo mehr referenziert wird,
solange aber FileLoader es kennt, bleibt es auch bestehen, auch in FileLoader wird keine Variable magisch auf null gesetzt

ein allgemein denkbares Problem: wenn in der run-Methode ein lokaler ObjectInputStream definiert wird (bei dir nicht)
und run() beendet ist, dann kann es dazu kommen, dass dieser nun undefinierte ObjectInputStream geschlossen wird,
was dann auch zum Ende des InputStream des Sockets führt,
der Socket kann also vielleicht kaputt gehen/ beendet werden, nicht aber null werden


----------

