Java 尝试连接到本地主机服务器时出现NullpointerException
标题可能不太清楚,我也不知道该如何表达我的问题,但简而言之,我正在尝试用java创建一个“聊天”程序。我使用两个不同的文件ChatServer和ChatClient 该程序的工作原理是首先打开ChatServer,然后打开ChatClient以连接到ChatServer。要连接,首先需要在第一个文本字段中写入用户名,然后按enter键。然后程序会尝试将您连接到服务器,问题就从这里开始 每次我尝试连接到服务器时,我都会收到nullpointerexception,我不明白为什么。我已经试了很长时间去理解,但是我看不出错误 该程序的要点是多个聊天客户端可以连接到聊天服务器(最多5人)并相互写入。我知道这个问题非常具体,我希望如果有人能给我指出正确的方向,我会非常高兴 ChatServerJava 尝试连接到本地主机服务器时出现NullpointerException,java,server,nullpointerexception,localhost,Java,Server,Nullpointerexception,Localhost,标题可能不太清楚,我也不知道该如何表达我的问题,但简而言之,我正在尝试用java创建一个“聊天”程序。我使用两个不同的文件ChatServer和ChatClient 该程序的工作原理是首先打开ChatServer,然后打开ChatClient以连接到ChatServer。要连接,首先需要在第一个文本字段中写入用户名,然后按enter键。然后程序会尝试将您连接到服务器,问题就从这里开始 每次我尝试连接到服务器时,我都会收到nullpointerexception,我不明白为什么。我已经试了很长时间
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)