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");
}
我 运行 我的代码出现 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");
}