2016-03-11 5 views
0

Я создаю игру с двумя игроками, в которой клиенты получают 2 строки с сервера и должны отвечать собственной строкой. Внутренняя обработка здесь не имеет значения. Главное, всякий раз, когда я отправляю данные с сервера, один из клиентов заканчивает показ NullPointerException для функции setText(). Я сбиваюсь с толку, так как никто в моем университете не знает причины этого. Пожалуйста, помогите мне решить эту проблему. Вот код (интегрированная среда NetBeans 7.3.1):Strange NullPointerException в Java Клиент-серверная программа

Сервер

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     
} 

This is the Exception

This is supposed to be the output if the client runs correctly

линии 272 в сообщение об ошибке - hword.setText (изменено Word)

+0

В то время, когда вы вызываете 'hword.setText' в свой основной метод, у вас нет гарантии, что' new Player1(). SetVisible (true); 'уже выполнен с помощью' invokeLater'. Следовательно, 'hword' по-прежнему' null'. – Berger

ответ

0

Значит, это означает, что hword является null, и вы должны убедиться, что он был инициализирован, прежде чем вы вызовете этот метод.

Любое обновление 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)); 

Таким образом, вам не нужны статические поля.

+0

Итак, среда IDE не позволит мне изменить код инициализации для метки hword ... так что я могу изменить свой код в main() на это: try { hword.setText (modifiedWord); } catch (NullPointerException ne) { hword = new javax.swing.JLabel (modifiedWord); } – pranavjain1108

+0

@ pranavjain1108 проблема в том, что не будет такой же JLabel. –

Смежные вопросы