Java 尝试通过ObjectOutputStream写入对象时引发的NullPointerException
我正在向服务器发送一个对象,该服务器是我正在发送的数据的包装类。我调试了它,它连接良好,但是当它到达客户端将对象写入输出流的部分时,它抛出一个nullpointerexception Main.javaJava 尝试通过ObjectOutputStream写入对象时引发的NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我正在向服务器发送一个对象,该服务器是我正在发送的数据的包装类。我调试了它,它连接良好,但是当它到达客户端将对象写入输出流的部分时,它抛出一个nullpointerexception Main.java public static void main(String[] args) { Client client = new Client("Client", "localhost"); Server server = new Server("Room", "Server"
public static void main(String[] args) {
Client client = new Client("Client", "localhost");
Server server = new Server("Room", "Server");
Thread tclient = new Thread(client);
Thread tserver = new Thread(server);
tserver.start();
tclient.start();
Message m = new Message();
m.addValue("Message", "Dummy Text");
client.transmit(m);
}
Client.java
private String username, ip;
private ObjectOutputStream writer;
public Socket socket;
public Client(String username, String ip) {
this.username = username;
this.ip = ip;
}
@Override
public void run() {
try {
socket = new Socket(ip, 22600);
Message msg = new Message();
msg.addValue("Username", username);
writer = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
writer.writeObject(msg);
writer.flush();
Listener listener = new Listener(socket, Client.class);
} catch (Exception e) {
}
}
public void transmit(Message msg) {
try {
System.out.println(1);
writer.writeObject(msg); // NullPointerException here
writer.flush();
System.out.println(2);
} catch (Exception e) {
e.printStackTrace();
}
}
堆栈跟踪:
java.lang.NullPointerException
at com.Client.transmit(Client.java:45)
at com.Main.main(Main.java:18)
这可能是与
线程
执行相关的问题,似乎您的传输
方法是在运行
方法完成执行之前执行的
使用适当的
wait/notify
机制来确保所需的结果。请添加stacktrace。显然,您得到了一个异常并在空的catch块中抑制了它,因此当您从transmit()
调用它时,writer
为空。不要这样写代码。您可能应该在Client
的构造函数中创建Socket
和输出流,并让IOException
被抛出,这样您就不会像没有发生异常一样继续处理异常。但是你真的被期望能够独自处理NPE。您也永远不会关闭套接字。这就是为什么您不使用空的catch块。很抱歉,这是一个测试应用程序。我打算用GUI实现它,所以我没有将printStackTrace方法放在catch块中。下次我会更仔细地记住在我完成最终应用程序之前打印堆栈跟踪。我不认为这个解决方案很重要。在构造函数中创建所有内容要简单得多。