Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空指针异常,哪里出错?_Java - Fatal编程技术网

Java 空指针异常,哪里出错?

Java 空指针异常,哪里出错?,java,Java,我正在努力写第一本Java书,现在正试图建立一个聊天室。我有一个聊天服务器和一个聊天客户端,可以互相连接。但是,当我尝试发送消息时,会出现以下错误: java.lang.NullPointerException at VerySimpleChatServer.tellEveryone(VerySimpleChatServer.java:61) at VerySimpleChatServer$ClientHandler.run(VerySimpleChatServer.java:2

我正在努力写第一本Java书,现在正试图建立一个聊天室。我有一个聊天服务器和一个聊天客户端,可以互相连接。但是,当我尝试发送消息时,会出现以下错误:

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>();