Java聊天程序:由于空指针异常,客户端类不工作
客户端类:Java聊天程序:由于空指针异常,客户端类不工作,java,nullpointerexception,Java,Nullpointerexception,客户端类: public void connect(String user){ try{ host = socket.getInetAddress(); socket = new Socket(host,port); } } 登录类: login.addActionListener(new ActionListener(){ @Override
public void connect(String user){
try{
host = socket.getInetAddress();
socket = new Socket(host,port);
}
}
登录类:
login.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String user = textInput.getText();
Client client = new Client(username, 7777);
client.setVisible(true);
try{
client.connect(username);
}
catch(NullPointerException e){
e.printStackTrace();
}
}
});
我正在从客户机
类调用connect,并尝试捕获NullPointerException
,但仍然出现错误。我还尝试插入一个null检查
,而不是try-and-catch子句
我试着四处看看,但没有找到任何答案。谁能告诉我怎么了吗?我想要的是客户端成功连接。在调用connectClient()之前,是否可以确保clientSocket已启动。在调用connectClient()之前,是否可以确保clientSocket已启动。最初,似乎有一个局部变量声明。评论指出,这可能是错误的。因此,问题是
客户机
类实例化了一个对象,但是登录
类没有获得对它的引用
EDIT2:经过进一步讨论,似乎尽管有一个main
方法,但实际的启动类是Login
类,而不是Client
类。因此,客户端
对象没有实例化
将实例化移动到登录
类解决了NPE问题
public class Login {
//declare and instantiate a Client object
static Client client = new Client();
....
loginB.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameTF.getText();
ClientGUI clientgui = new ClientGUI(username, 7777);
clientgui.setVisible(true);
try{
// get the instantiated client
System.out.println("Attempting connection for " + username +
"(client == null): " + (client == null ? "true" : "false"));
// use the static variable
client.connectClient(username);
}
catch(NullPointerException npe){
npe.printStackTrace();
}
}
});
}
最初,似乎有一个局部变量声明。评论指出,这可能是错误的。因此,问题是
客户机
类实例化了一个对象,但是登录
类没有获得对它的引用
EDIT2:经过进一步讨论,似乎尽管有一个main
方法,但实际的启动类是Login
类,而不是Client
类。因此,客户端
对象没有实例化
将实例化移动到登录
类解决了NPE问题
public class Login {
//declare and instantiate a Client object
static Client client = new Client();
....
loginB.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameTF.getText();
ClientGUI clientgui = new ClientGUI(username, 7777);
clientgui.setVisible(true);
try{
// get the instantiated client
System.out.println("Attempting connection for " + username +
"(client == null): " + (client == null ? "true" : "false"));
// use the static variable
client.connectClient(username);
}
catch(NullPointerException npe){
npe.printStackTrace();
}
}
});
}
您必须更改connectClient方法
public void connectClient(String user){
try{
//clientSocket is not instantiated yet
host = InetAddress.getByName("127.0.0.1");
clientSocket = new Socket(host,port);
String connected = user+" just connected";
clientGUI.appendMessage(accepted+"\n"+connected);
serverGUI.appendEventsLog(accepted+"\n"+connected);
new ClientHandler().run();
}
catch(Exception e){
sendMessage("Connection error: "+e);
serverGUI.appendEventsLog("Client "+new ClientGUI(username, port)+" failed to connect");
}
}
您必须更改connectClient方法
public void connectClient(String user){
try{
//clientSocket is not instantiated yet
host = InetAddress.getByName("127.0.0.1");
clientSocket = new Socket(host,port);
String connected = user+" just connected";
clientGUI.appendMessage(accepted+"\n"+connected);
serverGUI.appendEventsLog(accepted+"\n"+connected);
new ClientHandler().run();
}
catch(Exception e){
sendMessage("Connection error: "+e);
serverGUI.appendEventsLog("Client "+new ClientGUI(username, port)+" failed to connect");
}
}
每个NPE都有相同的原因:对象为空。据我所知,您没有提供任何代码来指示
客户机
对象的实例化位置。另外,我建议修改标题以指出问题。您可以参考问题,您可以编辑帖子并添加实例化客户端
(最好也是clientGUI
)的代码@niceman我在ActionListener中实例化了clientGUI,clientGUI
对象与client
对象有什么关系?@KevinO我编辑了代码以包含客户端类。我在客户机类的主方法中实例化了客户机对象。每个NPE都有相同的原因:对象为null。据我所知,您没有提供任何代码来指示客户机
对象的实例化位置。另外,我建议修改标题以指出问题。您可以参考问题,您可以编辑帖子并添加实例化客户端
(最好也是clientGUI
)的代码@niceman我在ActionListener中实例化了clientGUI,clientGUI
对象与client
对象有什么关系?@KevinO我编辑了代码以包含客户端类。我在客户机类的main方法中实例化了客户机对象。它是一个NPE,因此如果connectClient()
失败,我会期望出现不同的异常(除非,我假设username
为null)。我在connectClient()中实例化clientSocket
)
方法是因为在客户端连接之前,套接字不应该打开。我对其他聊天/服务器程序做了一些研究,套接字是以某种“启动连接”方法实例化的。它是一个NPE,因此如果connectClient()
失败,我会期望出现不同的异常(除非username
为空)。我在connectClient()
方法中实例化clientSocket
的原因是,在客户端连接之前,套接字不应该打开。我对其他聊天/服务器程序做了一些研究,socket是以某种“启动连接”方法实例化的,很抱歉给您带来了困惑,感谢您的耐心;我没有在任何主类中声明任何变量。我所做的唯一一件事就是在客户机类的主方法中实例化客户机对象。显然,您在main
方法Client=newclient(…)代码>如果这是一个打字错误,好吧,但这确实是你以前的错误。尽管如此,如果您的编辑是正确的,登录
类如何拥有您在客户端
类中定义的变量?@Guest,我已经根据您的评论更新了答案。基本上,如果main
实例化了客户机,但是Login
类需要它,那么您将需要Login
类获得它的机制。有很多方法,但有一个例子显示,Login
在Client
中调用一个新方法来获取它。我编辑了代码,将getter方法包括在Client
类中,并更新了Login
类,但仍然得到一个异常。您是否认为问题可能与connectClient()
方法中调用的username
变量有关?让我们一起来看看。很抱歉造成混淆,感谢您的耐心等待;我没有在任何主类中声明任何变量。我所做的唯一一件事就是在客户机类的主方法中实例化客户机对象。显然,您在main
方法Client=newclient(…)代码>如果这是一个打字错误,好吧,但这确实是你以前的错误。非物质