Java Client-Server 程序中的 Strange NullPointerException



我正在创建一个 2 人游戏,其中客户端从服务器接收 2 个字符串,并且必须使用自己的字符串进行响应。内部处理在这里无关紧要。最主要的是,每当我从服务器发送数据时,其中一个客户端最终都会显示 setText() 函数的 NullPointerException。我很困惑,因为我的大学里没有人知道其中的原因。请帮我解决这个问题。下面是代码(IDE 是 NetBeans 7.3.1):

服务器

public class TCPServer {
public static void main(String argv[]) throws Exception {
    String childWord, childWord2;
    Trie1 obj = new Trie1();
    obj.loadTrie();
    ServerSocket welcomeSocket = new ServerSocket(6759);
    ServerSocket welcomeSocket2 = new ServerSocket(6559);
    //BufferedReader dd = new BufferedReader(new InputStreamReader(System.in));
    String parentWord;
    while (true) {
        Socket connectionSocket = welcomeSocket.accept();
        Socket connectionSocket2 = welcomeSocket2.accept();
        //parentWord = dd.readLine();
        parentWord = GlobalStuff.word;
        System.out.println("word: "+parentWord);
        BufferedReader inFromClient =
                new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient =
                new DataOutputStream(connectionSocket.getOutputStream());
        BufferedReader inFromClient2 =
                new BufferedReader(new InputStreamReader(connectionSocket2.getInputStream()));
        DataOutputStream outToClient2 =
                new DataOutputStream(connectionSocket2.getOutputStream());
        outToClient.writeBytes(parentWord + "n");
        outToClient2.writeBytes(parentWord + "n");
        outToClient.writeBytes(GlobalStuff.sentence + "n");
        outToClient2.writeBytes(GlobalStuff.sentence + "n");
        childWord = inFromClient.readLine();
        childWord2 = inFromClient2.readLine();
        /*System.out.println(childWord);
         System.out.println(childWord2);*/
        //System.out.println(clientSentence);
        if (childWord.equals(childWord2)) {
            System.out.println("The suggestions match!!");
            obj.Trie1Main(parentWord, childWord);
        } else {
            System.out.println("The suggestions DO NOT match...the users entered:");
            System.out.println(childWord+" and "+childWord2);
        }
    }
}
}

客户:

package clientserver;
import markI.*;
import sessionmanager.*;
import java.io.*;
import java.net.*;
public class Player1 extends javax.swing.JFrame {
private static Socket clientSocket;
private static BufferedReader inFromUser;
private static DataOutputStream outToServer;
private static BufferedReader inFromServer;
private static String modifiedSentence;
private static String modifiedWord;
/**
 * Creates new form TestFrameOne
 */
public Player1() {
    initComponents();
}
//user defined
private void initComponents() {
    tlabel = new javax.swing.JLabel();
    ilabel = new javax.swing.JLabel();
    totalScore = new javax.swing.JLabel();
    wordtf = new javax.swing.JTextField();
    submit = new javax.swing.JButton();
    close = new javax.swing.JButton();
    round = new javax.swing.JLabel();
    opponent = new javax.swing.JLabel();
    hword = new javax.swing.JLabel();
    timeLeft = new javax.swing.JLabel();
    points = new javax.swing.JLabel();
    jButton1 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    sentenceArea = new javax.swing.JTextArea();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    tlabel.setFont(new java.awt.Font("Trebuchet MS", 1, 24)); // NOI18N
    tlabel.setForeground(new java.awt.Color(51, 0, 255));
    tlabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    tlabel.setText("WORD KING");
    ilabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    ilabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/markI/crown_low.png"))); // NOI18N
    totalScore.setFont(new java.awt.Font("Trebuchet MS", 1, 16)); // NOI18N
    totalScore.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    totalScore.setText("0");
    totalScore.setBorder(javax.swing.BorderFactory.createTitledBorder("Net Score"));
    wordtf.setFont(new java.awt.Font("Trebuchet MS", 0, 14)); // NOI18N
    wordtf.setBorder(javax.swing.BorderFactory.createTitledBorder("Alternate Word"));
    submit.setBackground(new java.awt.Color(102, 0, 255));
    submit.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
    submit.setText("Submit");
    submit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            submitActionPerformed(evt);
        }
    });
    close.setText("X");
    close.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            closeActionPerformed(evt);
        }
    });
    round.setFont(new java.awt.Font("Trebuchet MS", 1, 16)); // NOI18N
    round.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    round.setText("0");
    round.setBorder(javax.swing.BorderFactory.createTitledBorder("Round"));
    opponent.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    opponent.setIcon(new javax.swing.ImageIcon(getClass().getResource("/markI/face_low.jpg"))); // NOI18N
    opponent.setBorder(javax.swing.BorderFactory.createTitledBorder("OPPONENT"));
    hword.setFont(new java.awt.Font("Trebuchet MS", 1, 18)); // NOI18N
    hword.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    hword.setBorder(javax.swing.BorderFactory.createTitledBorder("Highlighted Word"));
    timeLeft.setFont(new java.awt.Font("Trebuchet MS", 1, 16)); // NOI18N
    timeLeft.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    timeLeft.setText("30");
    timeLeft.setBorder(javax.swing.BorderFactory.createTitledBorder("Time"));
    points.setFont(new java.awt.Font("Trebuchet MS", 1, 16)); // NOI18N
    points.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    points.setText("0");
    points.setBorder(javax.swing.BorderFactory.createTitledBorder("Points"));
    jButton1.setBackground(new java.awt.Color(102, 0, 255));
    jButton1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
    jButton1.setText("Leave Game");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });
    sentenceArea.setColumns(20);
    sentenceArea.setRows(5);
    sentenceArea.setText("The quick brown fox jumps over a lazy dog.");
    sentenceArea.setBorder(javax.swing.BorderFactory.createTitledBorder("Sentence"));
    jScrollPane1.setViewportView(sentenceArea);
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(hword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(wordtf, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE))
                                .addGroup(layout.createSequentialGroup()
                                    .addGap(55, 55, 55)
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(ilabel)
                                        .addComponent(tlabel))))
                            .addGap(18, 18, 18)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(points, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(18, 18, 18)
                                        .addComponent(timeLeft, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(round, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(18, 18, 18)
                                        .addComponent(totalScore, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(opponent)
                                    .addGap(18, 18, 18)
                                    .addComponent(close)))))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(layout.createSequentialGroup()
                    .addGap(21, 21, 21)
                    .addComponent(submit, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(35, 35, 35))))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(29, 29, 29)
                        .addComponent(opponent))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(close)))
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addComponent(ilabel)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(tlabel)))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(hword, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(round)
                .addComponent(totalScore))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(points)
                .addComponent(timeLeft)
                .addComponent(wordtf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(submit, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap())
    );
    pack();
}// </editor-fold>                        
private void submitActionPerformed(java.awt.event.ActionEvent evt) {                                       
    //wordtf.setText(modifiedSentence);
    try {
        String sentence = wordtf.getText();
        System.out.println(sentence);
        outToServer.writeBytes(sentence + 'n');
        clientSocket.close();
    } catch (Exception e) {
        System.out.println("Some error through submit button.n" + e.getMessage());
    }
}                                      
private void closeActionPerformed(java.awt.event.ActionEvent evt) {                                      
    System.exit(WIDTH);        // TODO add your handling code here:
}                                     
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    this.setVisible(false);
    sessionmanager.WelcomePage.main(null);
}                                        
/**
 * @param args the command line arguments
 */
public static void main(String args[]) throws Exception {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(TestFrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TestFrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(TestFrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TestFrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Player1().setVisible(true);
        }
    });
    //Start clientserver
    inFromUser = new BufferedReader(new InputStreamReader(System.in));
    clientSocket = new Socket("172.16.30.183", 6759);
    //clientSocket = new Socket("172.16.38.156", 6759);
    outToServer = new DataOutputStream(clientSocket.getOutputStream());
    inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    modifiedWord = inFromServer.readLine();
    System.out.println("FROM SERVER: word " + modifiedWord);
    hword.setText(modifiedWord);
    modifiedSentence = inFromServer.readLine();
    System.out.println("FROM SERVER: sentence " + modifiedSentence);
    sentenceArea.setText(modifiedSentence);
    //End clientserver
}
// Variables declaration - do not modify                     
private javax.swing.JButton close;
public static javax.swing.JLabel hword;
private javax.swing.JLabel ilabel;
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel opponent;
private javax.swing.JLabel points;
private javax.swing.JLabel round;
public static javax.swing.JTextArea sentenceArea;
private javax.swing.JButton submit;
private javax.swing.JLabel timeLeft;
private javax.swing.JLabel tlabel;
private javax.swing.JLabel totalScore;
public static javax.swing.JTextField wordtf;
// End of variables declaration                   
}

这是例外

这应该是客户端正常运行时的输出

错误消息中的第 272 行是 hword.setText(modifiedWord)

因此,这意味着hwordnull的,您必须确保在调用此方法之前已初始化它。

在任何情况下,对 GUI 的任何更新都应在 GUI 线程上执行。 我建议您提交一个任务来执行更新。 这样,它应该在你使用它的时候初始化。

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        hword.setText(modifiedWord);
    }
});

不过,您应该做的是在 Player1 实例上调用此方法,而不是设置静态字段。您真的不应该在构造函数中初始化静态字段。

Player1 player1 = new Player1();
EventQueue.invokeLater(() -> player1.setVisible(true));
EventQueue.invokeLater(() -> player1.setHwordText(modifiedWord));

这样,您就不需要静态字段。

最新更新