Java 尝试通过ObjectOutputStream写入对象时引发的NullPointerException

Java 尝试通过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"

我正在向服务器发送一个对象,该服务器是我正在发送的数据的包装类。我调试了它,它连接良好,但是当它到达客户端将对象写入输出流的部分时,它抛出一个nullpointerexception

Main.java

    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块中。下次我会更仔细地记住在我完成最终应用程序之前打印堆栈跟踪。我不认为这个解决方案很重要。在构造函数中创建所有内容要简单得多。