Event Handling windowAdapter - NullPointerException beim Schließen

Lehrlii

Mitglied
Hi,
hab mir einen kleinen Chat gebastelt und hab leider ein Problem beim Schließen des Programms.
Jedes mal wenn ich den "X"-'Button benutze bekomm ich folgende Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Mein Client besteht aus 2 Klassen, eine Klasse ist der Client selbst, die andere soll noch so weit ausgebaut werden, dass ich IP, Port und Username einstellen kann und startet bis jetzt nur den Client.

Klasse des Client, client:
Java:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class client extends JFrame implements WindowListener{
	
	private JTextField userText;
	private JTextArea chatWindow;
	private ObjectOutputStream output;
	private ObjectInputStream input;
	private String message = "";
	private String serverIP;
	private int serverPort=7777;
	private Socket connection;
	
	//constructor
	public client(String host){
		super("Client");
		serverIP = host;
		userText = new JTextField();
		userText.setEditable(false);
		userText.addActionListener(
			new ActionListener(){
				public void actionPerformed(ActionEvent event){
					sendMessage(event.getActionCommand());
					userText.setText("");
				}
			}
		);
		add(userText, BorderLayout.NORTH);
		chatWindow = new JTextArea();
		add(new JScrollPane(chatWindow), BorderLayout.CENTER);
		addWindowListener(this);
		setSize(300,150);
		setVisible(true);
	}
	
	//connect to server
	public void startRunning(){
		try{
			connectToServer();
			setupStreams();
			whileChatting();
		}catch(EOFException eofException){
			showMessage("\nClient terminated the conneciton");
		}catch(IOException ioException){
			ioException.printStackTrace();
		}finally{
			closeCrap();
		}
	}
	
	//connect to a server
	private void connectToServer() throws IOException{
		showMessage("Attempting connection---\n");
		connection = new Socket(InetAddress.getByName(serverIP), serverPort);
		showMessage("Cennected to :" + connection.getInetAddress().getHostName());
	}
	
	//setup streams to send and receive messages
	private void setupStreams() throws IOException{
		output = new ObjectOutputStream(connection.getOutputStream());
		output.flush();
		
		input = new ObjectInputStream(connection.getInputStream());
		showMessage("\nstreams are setup \n");
	}
	
	//while chatting with server
	private void whileChatting() throws IOException{
		ableToType(true);
		do{
			try{
				message = (String) input.readObject();
				showMessage("\n" + message);
			}catch(ClassNotFoundException classNotFoundException){
				showMessage("unkown object type");
			}
		}while(!message.equals("SERVER - END)"));
	}
	//close the streams and sockets
	private void closeCrap(){
		showMessage("closing....");
		ableToType(false);
		try{
			output.close();
			input.close();
			connection.close();
			System.exit(0);
		}catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
	
	//send messages to server
	private void sendMessage(String message){
		try{
			output.writeObject("CLIENT - " + message);
			output.flush();
			showMessage("\nClient - " + message);
		}catch(IOException ioExceotion){
			chatWindow.append("failed sending message");
		}
	}
	
	//update chat windows
	private void showMessage(final String message){
		SwingUtilities.invokeLater(
			new Runnable(){
				public void run(){
					chatWindow.append(message);
				}
			});
	}
	
	//gives user permission to type into the chat window
	private void ableToType(final boolean tof){ //tof ... true or false
		SwingUtilities.invokeLater(
			new Runnable(){
				public void run(){
					userText.setEditable(tof);
				}
			}
				
		);
	}
	
	//window methods, used to close the connection with the x button
	@Override
	public void windowClosing( WindowEvent event )  {
		try {
			output.writeObject("CLIENT - END");
			output.flush();
			closeCrap();
			System.exit(0);
		} catch (IOException ioException) {
			ioException.printStackTrace();
		}
	
	  }
	
	 @Override
	 public void windowClosed( WindowEvent event ) { /*Empty*/ }
	 
	 @Override
	 public void windowDeiconified( WindowEvent event ) { /*Empty*/ }
	 
	 @Override
	 public void windowIconified( WindowEvent event ) { /*Empty*/ }
	 
	 @Override
	 public void windowActivated( WindowEvent event ) { /*Empty*/ }
	
	 @Override
	 public void windowDeactivated( WindowEvent event ) { /*Empty*/ }
	 
	 @Override
	 public void windowOpened( WindowEvent event ) { /*Empty*/ }
	  

}


Klasse zum Starten des Clients, clientTest:
Java:
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class clientTest {
		
	public static void main(String[] args) {
		client client;
		client = new client("127.0.0.1");
		client.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		client.startRunning();
	}
}

Dazu hätte ich jetzt 2 Fragen:
1. Was heißt genau die oben genannte Fehlermeldung?
2. Wie kann ich den Fehler beheben und worin liegt er?

Ich bedanke mich schon mal im vorhinein für die Antworten und mit freundlichen Grüßen
Lehrlii
 
es ist die häufigste Fehlermeldung überhaupt, noch nicht gesehen?
irgendeine Variable, auf die zugriffen wird, ist null,

gibts nicht mehr im StackTrace, genaue Zeilennummern in deiner client-Klasse?
prüfe duch Ausgaben, ob die allgemein verdächtigen Objekte, connection, output, input, null sind oder nicht

funktioniert es denn vorher, steht connection, kann man schreiben und lesen?

bei mir auf die Schnelle nicht zu testen mit Verbindung, sieht grob betrachtet alles richtig aus,
aber der Fehler spricht natürlich stark dagegen

Klassennamen beginnen mit Großbuchstaben!
 
danke das mit den klassennamen werden ich mir merken

ich hab mir die fehlermeldung angeschaut und es der output.close() in zeile 103 ist null.

ich hab jz so eingestellt wenn sich das Programm automatisch schließt wenn es keine verbindung aufbauen kann dh. ich hab in zeile 64 system.exit(0); eingefügt
diese lösung finde ich aber nicht zufriedenstellend, ich hätt nämlich gerne, dass das Fenster bestehen bleibt.

ich hab eingestellt dass wenn ich auf x-Drücke, dass das Programm noch eine Nachricht an den Server sendet, das steht bereits im Programmcode in der windowClosing methode, daran liegt es wahrscheinlich auch, dass ich das Programm nicht schließen kann wenn es keine Verbindung aufbauen konnte.
 
wo immer connection/ output usw. benötigt werden kannst du per if schauen ob null und gegebenfalls das nicht tun, was zur Exception führt,
ist nicht der schönste Code, aber wenn du die zusätzliche Funktionalität haben willst, diesen Fall zu berücksichtigen, geht das nicht per Zauberei

natürlich sollte man es vermeiden, derartiges an zig ähnlichen Code-Stellen einzubauen,
dann lieber eine Wrapperklasse drumherum, die die Arbeit in wenigen Methoden konzentriert
 
ich muss ehrlich zugeben dass ich einsteiger bin und mit hilfe von einem fertigen tutorial diesen chat gebaut habe

eine Frage dann noch: Was meinst du mit einer Wrapperklasse?

und danke das mit den if bedingungen mach ich das jz
 
an 10 Stellen

Java:
if (x == null) {
 hmm
} else {
  x.callY();
}
ist unschön, dann lieber ein sicheres Objekt z erstellen, welches x intern enthält sowie eine Methode callY() und darin das if/else ausführt,
so muss im Hauptprogramm nur noch 10x z.callY() stehen, viel besser

muss auch gar nicht unbedingt eine eigene Klasse sein, eine Methode hilft bereits so wie sendMessage() ja schon besser ist
als mehrfach die ganzen Zeilen mit try/catch zu schreiben

du siehst: du kannst und machst es eh schon, ganz normal, auch ohne komische Begriffe 😉
 

Zurück
Oben