java.lang.NullPointerException

starbuck86

Mitglied
Hallo Comm.

Ich habe für mein Projekt eine Klasse erstellt, in der ein Socket-Server läuft, welcher dynamisch Connections annimmt und OutputStream und InputStream-Objekte zuweist. Diese Klasse ist als Thread über eine Hauptklasse gestartet.
Java:
public class SServer implements Runnable {
	
	private static Socket[] client = new Socket[10];
	private static OutputStream[] out = new OutputStream[10];
	private static InputStream[] in = new InputStream[10];

	public void handleConnection(int count) throws IOException {
		in[count] = client[count].getInputStream();
		out[count] = client[count].getOutputStream();
		out[count].write(1);
	}
	
	public OutputStream getOutputStream (int z){
		return out[z];
	}
	public Socket getSocket (int z){
		return client[z];
	}

	ServerSocket server1 = null;
	Socket client_default = null;

	public void run()
	{		
		try { //Socket-Server starten
			server1 = new ServerSocket(14002);
			while (true) {  
				try { //Clients annehmen
					client_default = server1.accept();
					if (client_default != null){
						for (int i=0; i < client.length; i++) {
							if (client[i] == null) {
								client[i] = client_default;
								handleConnection(i);
								break;
							}
						}	
						client_default = null;
					}
				} catch (IOException e) {
					e.printStackTrace();}
			} //Endlosschleife zum Annehmen der neuen Connections
		} catch (IOException ioe) {
			ioe.printStackTrace();}		
	}
}

Dazu gibt es eine zweite Klasse, die ebenfalls als Thread gestartet wird. Diese Klasse sendet in einer Endlosschleife der vorhandene Connections über das out Objekt die Zahl 7.
Jedenfalls in der Theorie.

In der Praxis sieht es allerdings etwas anders aus.
Sobald ich über out.write(7); (2.Quellcode, Zeile 8) etwas schreiben will bekomme ich eine NullPointerException.

Java:
public class SServer_send extends SServer implements Runnable {
	public void run() {
		try {
			while (true) {
				for (int j=0; j<=9; j++) {
					if (getSocket(j) != null) {
						System.out.println(getSocket(j)+"\n");
						getOutputStream(j).write(7);
						//closeConnection(j);
					}
				}
			}
		} catch (IOException x) {
			x.printStackTrace();
		}
	}
}

Kann mir einer sagen, warum ich diese Meldung bekomme?
Ich lass mir doch das OutputStream-Objekt out zurückgeben mit der selbst definierten Methode getOutputStream() - dachte ich zumindest.

Gruß && Danke
Thomas
 
Zuletzt bearbeitet:
Der warscheinlichste Grund wäre wohl, dass der 2. Source auf ein Feld des Arrays zugreifen will, wo noch nichts "gescheites" drinnensteht.
Ändere mal:

Java:
public OutputStream getOutputStream (int z)
{
	System.out.println(z + " - " + out[z]);
	return out[z];
}

Wenn er dir wärend dem Test "null" ausgibt hast du einen Fehler.
 
Der hatte noch einen NULL-Wert.
Java:
if (getSocket(j) != null) {
	while (getOutputStream(j) == null) {
		try { Thread.sleep(500); } 
		catch(InterruptedException e) { e.printStackTrace(); }
	}
	System.out.println(getSocket(j)+"\n");
	getOutputStream(j).write(7);
	//closeConnection(j);
	}
Jetzt klappts, hatte wohl etwas gedauert bis er den OutputStream hinzugefügt hat.

Danke - seh manchmal den Wald vor lauter Bäumen nicht mehr.

//Edit: Könnt ihr mir vielleicht sagen, wie ich mehr als nur 1 Byte übertragen muss? Vielleicht mit nem kleinen Codebeispiel?
 
Du kannst ganz einfach auch zeichenorientierte Streams verwenden. z.B. PrintWriter um zu schreiben/senden und BufferedReader um zu lesen/empfangen. Stichwort hier heisst "Streamverkettung"... findest du sicherlich einiges im Netz dazu...
 
Hier 2 Methoden, die ich auch immer verwende:

Java:
public String receive(java.net.Socket server, int bufferlength)
{
	try
	{
		if(bufferlength == 0)
			bufferlength = 1024;
		
		java.io.BufferedReader bufferedReader =
			new java.io.BufferedReader(
					new java.io.InputStreamReader(server.getInputStream()));

		char[] buffer = new char[bufferlength];

		int anzahlZeichen = 0;
		anzahlZeichen = bufferedReader.read(buffer, 0, 200);

		String nachricht = new String(buffer, 0, anzahlZeichen);
		return(nachricht);
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	return(null);
}
public void send(java.net.Socket server, String string)
{
	try
	{
		java.io.PrintWriter printWriter =
			new java.io.PrintWriter(
				new java.io.OutputStreamWriter(
						server.getOutputStream()));
		printWriter.print(string);
		printWriter.flush();
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
}
 
Zurück