Exception in thread
Folgenden Fehler sind behoben, durch das entfernen der Erklärung aber ein anderes ist aufgetaucht, die es vorher nicht gab.
Empfang von zwei Fehlern keine Einsicht wäre toll, danke.
Exception in thread "main" java.lang.NullPointerException
bei ChatClient.(ChatClient.java:27)
bei ChatClient.main(ChatClient.java:59)
Aus der folgenden ChatClient:
import java.net.*;
import java.io.*;
public class ChatClient
{ private Socket socket = null;
private BufferedReader console = null;
private BufferedReader streamIn = null;
private DataOutputStream streamOut = null;
public ChatClient(String serverName, int serverPort, String userName)
{ System.out.println("Establishing connection. Please wait...");
try
{ socket = new Socket(serverName, serverPort);
System.out.println("Connected: " + socket);
System.out.println("CTRL+C or type .bye to quit");
start();
}
catch(UnknownHostException uhe)
{ System.out.println("Host unknown: " + uhe.getMessage());
}
catch(IOException ioe)
{ System.out.println("Unexpected exception: " + ioe.getMessage());
}
String line = "";
while (!line.equals(".bye"))
{ try
{ line = console.readLine();
streamOut.writeBytes(line + '\n'); //Send console data to server socket
String reply = streamIn.readLine(); //Recieve confirmation msg from server
System.out.println( reply ); //Print the msg
streamOut.flush();
}
catch(IOException ioe)
{ System.out.println("Sending error: " + ioe.getMessage());
}
}
}
public void start() throws IOException
{ console = new BufferedReader(new InputStreamReader(System.in)); //Changed console to BufferedReader
streamIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
streamOut = new DataOutputStream(socket.getOutputStream());
}
public void stop()
{ try
{ if (console != null) console.close();
if (streamOut != null) streamOut.close();
if (streamIn != null) streamIn.close(); //Is it good practice to close
if (socket != null) socket.close();
}
catch(IOException ioe)
{ System.out.println("Error closing ...");
}
}
public static void main(String args[])
{ ChatClient client = null;
if (args.length != 3)
System.out.println("Usage: java ChatClient host port username");
else
client = new ChatClient(args[0], Integer.parseInt(args[1]), args[2]);
}
}
und dieser Fehler:
Exception in thread "Thread-1" java.lang.NullPointerException
at ChatServerThread.handleClient(ChatServerThread.java:41)
at ChatServerThread.run(ChatServerThread.java:17)
vom ChatServerThread:
import java.net.*;
import java.io.*;
//public class ChatServerThread implements Runnable
public class ChatServerThread extends Thread
{ private Socket socket = null;
private ChatServer server = null;
private int ID = -1;
private BufferedReader streamIn = null;
private DataOutputStream streamOut = null;
public ChatServerThread(ChatServer _server, Socket _socket)
{ server = _server; socket = _socket; ID = socket.getPort();
}
public void run() {
try {
handleClient();
} catch( EOFException eof ) {
System.out.println("Client closed the connection.");
} catch( IOException ioe ) {
ioe.printStackTrace();
}
}
public void handleClient() throws IOException {
boolean done = false;
try {
System.out.println("Server Thread " + ID + " running.");
while (!done) {
String nextCommand = streamIn.readLine();
if( nextCommand.equals(".bye") ) {
System.out.println("Client disconnected with bye.");
done = true;
} else {
System.out.println( nextCommand );
String nextReply = "You sent me: " + nextCommand.toUpperCase() + '\n';
streamOut.writeBytes ( nextReply );
}
}
} finally {
streamIn.close();
streamOut.close();
socket.close();
}
}
public void open() throws IOException
{
streamIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
streamOut = new DataOutputStream(socket.getOutputStream());
}
public void close() throws IOException
{ if (socket != null) socket.close();
if (streamIn != null) streamIn.close();
if (streamOut != null) streamOut.close();
}
}
- Bitte in der code-was exakte Linien verursacht werden diese Fehler Dank.
- Welche Zeilen in Ihr Muster hat die NPE entsprechen. Etwas, was in dieser Zeile null sein müssen. Vielleicht haben Sie nicht rufen start() irgendwo?
- Aktualisierte Antwort vom feedback unter, aber ein weiterer thread Ausgabe erschienen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist diese Zeile:
console
ist immer noch null. Auch wenn Sie anrufenstart()
es nicht tun, was Sie denken, es bedeutet:Diese deklariert eine neue lokalen variable namens
console
. Es ändert nicht den Wert der Instanz variable namensconsole
. Um das zu tun, entfernen Sie den Deklarationsteil:Sogar mit das zu ändern, könnten Sie Probleme bekommen - denn wenn die hat eine Ausnahme, hier ist was Sie tun, mit der Sie im Konstruktor:
Sind Sie dann weiter, wie wenn nichts geschehen wäre. Tun Sie das nicht. Du bist nicht wirklich "handling" - die Ausnahme -, so dass Sie sollte fast sicher entweder nicht fangen es in den ersten Platz, oder rethrow es in deinem catch-block.
Nebenbei, Ihre belebenden Stil ist sehr dicht, nicht sehr konventionell, und inkonsistent. Ich würde stark abgeraten, einschließlich folgender code eine öffnende geschweifte Klammer (auf derselben Zeile). Wie es ist, dein code ist ziemlich schwer zu Lesen für jemand verwendet, um entweder der (erheblich) mehr gemeinsame übereinkommen von:
oder
Nun sollte es laufen, für den Kunden
In Ihrem start-Methode
}
Erklären Sie neue lokalen Variablen, anstatt, wie ich denke, dass Sie beabsichtigt, die Zuweisung der Instanz-Variablen, die Sie deklariert ist. Wenn Sie es ändern, um
Sollte es funktionieren
Machen Sie die gleichen Fehler in der
open()
Methode Ihrer zweiten KlasseDies ist da, die Konsole ist null. Um das problem zu beheben, ändern Sie Ihre
start();
Methode:Für die erste Ausnahme,
console
ist nie ein Objekt zugewiesen, so können Sie nicht rufen Sie eine Methode auf:Ebenso für die zweite Ausnahme,
Sich das problem erneut-unter Angabe der Typen der Variablen in
start()
. Diese tatsächlich schafft neue Variablen, die nur lokal zu dieser Methode, und bezieht sich nicht auf die globalen Dateien mit dem gleichen Namen.streamIn.close();
, diese beziehen sich möglicherweise auf die zweite Fehlermeldung, die ich erhalte beim schließen der client mit CTRL-CstreamIn = new BufferedReader...
stattBufferedReader streamIn = new BufferedReader...
wie vorgeschlagen von allen.