java.lang.NullPointerException PrintWriter

java.lang.NullPointerException PrintWriter

我 运行 我的代码出现 NullPointerException。我已将问题缩小到第 38 行:当它被注释掉时,程序不会给出任何错误。我现在只有 "test"。

out.println("test")

运行 方法立即开始,在另一个 class

中有以下两行
Client test = new Client();
test.start();

当按下按钮时,将执行以下代码,其中 运行sendToServer 方法

Client test = new Client();
test.sendToServer(cipherText)

下面是我的客户的完整代码 class。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client extends Thread{

    String line = "";
    String cipherText = "";

    BufferedReader in;
    PrintWriter out;

    public void run(){
            String serverAddress = "00.000.000.000";
        try{
            Socket socket = new Socket(serverAddress, 8888);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
        }
        catch(IOException e){
            e.printStackTrace();
        }
        while (true) {
            try{
                line = in.readLine();
            }
            catch(IOException e){
                e.printStackTrace();
            }
            System.out.println(line);
        } 
    }

    public void sendToServer(String in) {
        out.println("test");
    }

}

感谢观看,我还在学习中java如有明显错误请见谅。

那是因为你使用了PrintWriter out;作为你的class成员但是你还没有初始化它。默认情况下,所有未初始化的成员对象都使用 null 进行初始化。如果先调用 sendToServer(),则 out 将是 null,您将得到 NullPointerException.

编辑

问题是您试图在 Client.

的两个不同实例上调用 run()sendToServer() 方法
Client test = new Client(); // First instance
test.start();               // which calls run() and then initializes out variable.

然后从以下位置创建第二个实例:

Client test = new Client();    // Second instance
test.sendToServer(cipherText); // since out is not initialized for this instance, you are getting NPE

我假设您正在多线程环境中使用 Client 对象,在这种情况下,我建议您确保两个线程都使用相同的 Client 对象实例。此外,如果正在共享 Client 实例,您可能希望同步访问 out 变量,并确保在按钮之前先执行 Client 的 运行 方法按下(依次调用 sendToServer())。

您在 class 的开头:

PrintWriter out;

如果您不在 sendToServer() 之前调用 运行() [是您初始化它的地方],"out" 将永远不会被初始化并且将为 null。

Your function assumes out Printwriter will be initialized, but if there is an exception in the socket initialization, it will never by initialized.  Two things I would do...

1. Initialize out to null at the top of the run method.

2. protect your sendToServer code...

public void sendToServer(String in) throws NullPointerException
{
    if (out == null)
    {
          throw new NullPointerException("Out is null.");
    }
    out.println("test");
}