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(…)如果这是一个打字错误,好吧,但这确实是你以前的错误。非物质