Java 空指针异常,哪里出错?
我正在努力写第一本Java书,现在正试图建立一个聊天室。我有一个聊天服务器和一个聊天客户端,可以互相连接。但是,当我尝试发送消息时,会出现以下错误:Java 空指针异常,哪里出错?,java,Java,我正在努力写第一本Java书,现在正试图建立一个聊天室。我有一个聊天服务器和一个聊天客户端,可以互相连接。但是,当我尝试发送消息时,会出现以下错误: java.lang.NullPointerException at VerySimpleChatServer.tellEveryone(VerySimpleChatServer.java:61) at VerySimpleChatServer$ClientHandler.run(VerySimpleChatServer.java:2
java.lang.NullPointerException
at VerySimpleChatServer.tellEveryone(VerySimpleChatServer.java:61)
at VerySimpleChatServer$ClientHandler.run(VerySimpleChatServer.java:29)
at java.lang.Thread.run(Unknown Source)
我检查了我的电话,但我看不出哪里出了问题。我看不到任何地方有指向任何东西的指针
谁能帮我一点忙吗
ClientServer的代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class VerySimpleChatServer {
ArrayList clientOutputStreams;
public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSocket) {
try {
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch(Exception ex)
{
ex.printStackTrace();
}
}
public void run() {
String message;
try {
while (( message = reader.readLine()) != null) {
System.out.println(" read " + message);
tellEveryone(message);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
public static void main (String[] args) {
new VerySimpleChatServer(). go();
}
public void go() {
List<PrintWriter>clientOutputStreams = new ArrayList<>();
try {
ServerSocket serverSock = new ServerSocket( 5000);
while( true) {
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter( clientSocket.getOutputStream());
clientOutputStreams.add( writer);
Thread t = new Thread( new ClientHandler( clientSocket));
t.start(); System.out.println(" got a connection");
}
} catch(Exception ex)
{
ex.printStackTrace();
}
}
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while(it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
编辑:
SimpleChatServerClient的第60至74行:
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while(it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}您在
go
中使用的clientOutputStreams
List<PrintWriter>clientOutputStreams = new ArrayList<>();
是从未初始化过的类变量您在
go
中使用的clientOutputStreams
List<PrintWriter>clientOutputStreams = new ArrayList<>();
是从未初始化过的类变量感谢所有回复。我更改了以下内容以使代码正常工作: 在第7行中更改
ArrayList clientOutputStreams;
进入
进入
clientOutputStreams=newArrayList();
谢谢你的帮助 谢谢你的回复。我更改了以下内容以使代码正常工作: 在第7行中更改
ArrayList clientOutputStreams;
进入
进入
clientOutputStreams=newArrayList();
谢谢你的帮助 “VerySampleChatServer”的第61行是什么?添加了这些行,感谢您指出这一点。您正在调用ClientOutputStream上的一个方法,该方法尚未初始化。在“go”方法中,使用类似的名称初始化局部变量,但这对您没有帮助。Iterator it=clientOutputStreams.Iterator();-您从未初始化clientOutputStreams。“VerySampleChatServer”的第61行是什么?添加了这些行,感谢您指出这一点。您正在对ClientOutputStream调用一个未初始化的方法。在“go”方法中,使用类似的名称初始化局部变量,但这对您没有帮助。Iterator it=clientOutputStreams.Iterator();-您从未初始化clientOutputStreams。实际上不是一个“全局”变量,因为Java没有这些变量,而是一个实例变量。@Stultuske感谢您的评论。我在权衡是否应该使用正确的术语,也许会混淆术语。谢谢你们两位的解释。我明白了,但斯图尔图斯克让我意识到这不是一个正确的术语。话题:我将来能做些什么来避免我的负面分数?我在发布之前搜索过,使用了代码引号等…实际上不是一个“全局”变量,因为Java没有这些变量,而是一个实例变量。@Stultuske感谢您的评论。我在权衡是否应该使用正确的术语,也许会混淆术语。谢谢你们两位的解释。我明白了,但斯图尔图斯克让我意识到这不是一个正确的术语。话题:我将来能做些什么来避免我的负面分数?我在发布前搜索,使用代码引用等。。。
ArrayList<PrintWriter> clientOutputStreams;
List<PrintWriter>clientOutputStreams = new ArrayList<>();
clientOutputStreams = new ArrayList<PrintWriter>();