Java 尝试连接到本地主机服务器时出现NullpointerException

Java 尝试连接到本地主机服务器时出现NullpointerException,java,server,nullpointerexception,localhost,Java,Server,Nullpointerexception,Localhost,标题可能不太清楚,我也不知道该如何表达我的问题,但简而言之,我正在尝试用java创建一个“聊天”程序。我使用两个不同的文件ChatServer和ChatClient 该程序的工作原理是首先打开ChatServer,然后打开ChatClient以连接到ChatServer。要连接,首先需要在第一个文本字段中写入用户名,然后按enter键。然后程序会尝试将您连接到服务器,问题就从这里开始 每次我尝试连接到服务器时,我都会收到nullpointerexception,我不明白为什么。我已经试了很长时间

标题可能不太清楚,我也不知道该如何表达我的问题,但简而言之,我正在尝试用java创建一个“聊天”程序。我使用两个不同的文件ChatServer和ChatClient

该程序的工作原理是首先打开ChatServer,然后打开ChatClient以连接到ChatServer。要连接,首先需要在第一个文本字段中写入用户名,然后按enter键。然后程序会尝试将您连接到服务器,问题就从这里开始

每次我尝试连接到服务器时,我都会收到nullpointerexception,我不明白为什么。我已经试了很长时间去理解,但是我看不出错误

该程序的要点是多个聊天客户端可以连接到聊天服务器(最多5人)并相互写入。我知道这个问题非常具体,我希望如果有人能给我指出正确的方向,我会非常高兴

ChatServer

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

public class ChatServer extends Application 
{
    private ArrayList<ObjectOutputStream> outputToUsers;
    private TextArea taServer = new TextArea();
    private static final int MAX_USERS = 5;
    private boolean acceptingNewUsers = true;
    private int connectedUsers = 0;
    private static final int port = 4999;

    public static void main(String[] args) 
    {
        launch(args);
    }

    @Override  
    public void start(Stage primaryStage) 
    { 
        initializePrmaryStage(primaryStage);

        new Thread( () -> 
        { 
          try 
          { 
            // Create a server socket 
            @SuppressWarnings("resource")
            ServerSocket serverSocket = new ServerSocket(port);
            Platform.runLater(() -> taServer.appendText(new Date() + ": Server started at socket: " + port + '\n'));  
            acceptUsers();

            while (true) 
            { 
                if (acceptingNewUsers)
                {
                     // Listen for a new connection request 
                    Socket socket = serverSocket.accept();

                    connectedUsers++;
                    if (connectedUsers == MAX_USERS)
                        refuseNewUsers();

                  // Create and start a new thread for the connection 
                  new Thread(new AddUserToChat(socket)).start(); 
                }
            } 
          } 
          catch(IOException ex) 
          { 
            System.err.println(ex); 
          } 
        }).start(); 
     } 

    private void initializePrmaryStage(Stage stage)
    {
        taServer.setMinHeight(450);

         // Create a scene and place it in the stage 
        Scene scene = new Scene(new ScrollPane(taServer), 450, 400); 
        stage.setTitle("ChatServer"); // Set the stage title 
        stage.setScene(scene); // Place the scene in the stage 
        stage.show(); // Display the stage 
    }

    private void acceptUsers()
    {
        acceptingNewUsers = true;
        Platform.runLater(() -> taServer.appendText(new Date() + ": " + "Accepting users" + '\n'));

    }

    private void refuseNewUsers()
    {
        acceptingNewUsers = false;
        Platform.runLater(() -> taServer.appendText("Maximum user capacity reached." + '\n'));
    }

    private void writeToAll(String s)
    {
        try 
        {
            for (int x = 0; x < outputToUsers.size(); x++)
            {
                outputToUsers.get(x).writeObject(s);
                outputToUsers.get(x).flush();
            }
        } catch (IOException ex) 
        {
            ex.printStackTrace();
        } 
    }

    private void writeToLog(String s)
    {
        Platform.runLater(() -> 
        { 
            taServer.appendText(s); 
        }); 
    }

    private class AddUserToChat implements Runnable 
    {
         private ObjectInputStream fromUser;
         private ObjectOutputStream toUser;
         private String username;
         private Socket userSocket;

        @SuppressWarnings("unused")
        public AddUserToChat(Socket userSocket) 
         {
             this.userSocket = userSocket;
             connectedUsers++;
         }

        @Override
        public void run() 
        {
             try 
             {
                establishUserConnection();
                readMessagesFromUser();
             } 
             catch (Exception e) 
             {
                 System.err.println(e.getMessage());
                 removeUser();
             }
        }
         /*
         * Connects user to server
         * @throws IOException if {@link ObjectInputStream#readUTF()} encounters an error
         */
         private void establishUserConnection() throws IOException 
         {
             // Get input and output streams from socket
             toUser = new ObjectOutputStream(userSocket.getOutputStream());
             fromUser = new ObjectInputStream(userSocket.getInputStream());

             // Read and save username and save OOS to user in outputToUsers in ChatServer class
             username = fromUser.readUTF();
             outputToUsers.add(toUser);

             writeToLog(username + " joined the chat.");
             writeToAll(username + " joined the chat.");
         }

         /**
         * Removes user from server
         */
         private void removeUser() 
         {
             // Decrease user counter and remove OOS to user
            connectedUsers--;
            outputToUsers.remove(toUser);

             writeToLog(username + " left the chat.");
             writeToAll(username + " left the chat.");

             // If server doesn't accept new users, start accepting them once again
             if (!acceptingNewUsers) acceptUsers();
         }

         /**
         * Continually read messages from user
         *
         * @throws IOException if {@link ObjectInputStream#readUTF()} encounters an error
         */
         private void readMessagesFromUser() throws IOException 
         {
             while (true)
                 writeToAll(String.format("%s wrote: %s", username, fromUser.readUTF()));
         }
    }
}
TLDR

尝试连接到服务器时获取nullpointerexception,但我找不到问题

错误消息:

Exception in thread "Thread-5" java.lang.NullPointerException
    at chapter19.ChatServer$AddUserToChat.removeUser(ChatServer.java:171)
    at chapter19.ChatServer$AddUserToChat.run(ChatServer.java:143)
    at java.lang.Thread.run(Unknown Source)

属性
outputToUsers
未被日化,因此等于
null

这会导致在调用语句
outputToUsers.add(toUser)
establishUserConnection
时,在
AddUserToChat.run()中引发异常
捕获此异常,因此调用
removeUser


在此方法中,语句
outputToUsers.remove(toUser)
会导致一个新的异常。

属性
outputToUsers
未被日化,因此等于
null

这会导致在调用语句
outputToUsers.add(toUser)
establishUserConnection
时,在
AddUserToChat.run()中引发异常
捕获此异常,因此调用
removeUser


在这个方法中,
outputToUsers.remove(toUser)
语句会导致一个新的异常。

您没有初始化
removeUser
,因此当您访问它时它是空的。请检查异常是否很清楚。removeUser()方法有问题。为什么不调试代码呢?快速浏览一下,
establishUserConnection()
readMessagesFromUser()失败,因此输入您的
try…catch
将无法删除未连接的用户。您没有初始化
removeUser
,因此访问它时它为空。请检查异常是否清楚。removeUser()方法有问题。为什么不调试代码呢?快速浏览一下,
establishUserConnection()
readMessagesFromUser()失败了,所以输入你的
try…catch
是在试图删除一个未连接的用户。你说得太对了,我的朋友!我甚至没想过。将ArrayList序列化更改为:private static ArrayList outputousers=new ArrayList();现在我没有收到异常抛出,但每次我尝试连接时,用户都会断开连接。我需要检查一下,看看哪里会出错,但这很有帮助!谢谢你说得太对了,我的朋友!我甚至没想过。将ArrayList序列化更改为:private static ArrayList outputousers=new ArrayList();现在我没有收到异常抛出,但每次我尝试连接时,用户都会断开连接。我需要检查一下,看看哪里会出错,但这很有帮助!谢谢
Exception in thread "Thread-5" java.lang.NullPointerException
    at chapter19.ChatServer$AddUserToChat.removeUser(ChatServer.java:171)
    at chapter19.ChatServer$AddUserToChat.run(ChatServer.java:143)
    at java.lang.Thread.run(Unknown Source)