2011-04-25 3 views
0

나는 클라이언트 - 서버 채팅 응용 프로그램을 수행하는 것으로 구성된 미니 프로젝트 작업을하고 있습니다. 응용 프로그램 GUI 및 내 문제는 GUI에서 정보를 얻으려면 및 해당 서버에 연결할 노력하고 있지만 null 포인터 예외가 나타납니다. 지금까지 클라이언트 (GUI 클라이언트없이 테스트되었고 완벽하게 작동 함)에 대한이 코드가 있습니다.클라이언트 - 서버 응용 프로그램 null 포인터 예외

그래픽 사용자 인터페이스 클래스 :

package tema09client; 
public class GUI extends javax.swing.JFrame { 
    Comunicare test; 
    String host, port, uname; 
    int init=0; 

    public GUI() { 
     initComponents(); 
    } 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jPanel1 = new javax.swing.JPanel(); 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jLabel3 = new javax.swing.JLabel(); 
     jTextField2 = new javax.swing.JTextField(); 
     jLabel4 = new javax.swing.JLabel(); 
     jTextField3 = new javax.swing.JTextField(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setTitle("Network chat"); 
     setBackground(new java.awt.Color(255, 255, 255)); 
     setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); 

     jPanel1.setBackground(new java.awt.Color(255, 255, 255)); 

     jLabel1.setText("Pentru a va loga selectati host-ul si portul, apoi scrieti-va username-ul in causta si apasati OK."); 

     jLabel2.setText("HOST"); 

     jTextField1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jTextField1ActionPerformed(evt); 
      } 
     }); 

     jLabel3.setText("PORT"); 

     jLabel4.setText("USERNAME"); 

     jButton1.setText("Connect"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(jPanel1Layout.createSequentialGroup() 
         .addGap(79, 79, 79) 
         .addComponent(jLabel1)) 
        .addGroup(jPanel1Layout.createSequentialGroup() 
         .addGap(55, 55, 55) 
         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addGroup(jPanel1Layout.createSequentialGroup() 
           .addComponent(jLabel3) 
           .addGap(18, 18, 18) 
           .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE) 
           .addGap(132, 132, 132) 
           .addComponent(jButton1)) 
          .addGroup(jPanel1Layout.createSequentialGroup() 
           .addComponent(jLabel2) 
           .addGap(18, 18, 18) 
           .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) 
           .addGap(84, 84, 84) 
           .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE) 
           .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
           .addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE))))) 
       .addGap(81, 81, 81)) 
     ); 
     jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(37, 37, 37) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton1)) 
       .addContainerGap(185, Short.MAX_VALUE)) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {            

    }           

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     try{ 
     if(init==0){ 
       host=jTextField1.getText(); 
       port=jTextField2.getText(); 
       System.out.println(host+" "+port); 
       if((host!=null) && (port!=null)){ 
        test=new Comunicare(host, Integer.getInteger(port)); 
        test.start(); 
        init=1; 
       } 
      } 

     test.setMesaj("cheieloginStep1"); 
     uname=jTextField3.getText(); 
     test.setUname(uname); 
     }catch (NullPointerException e) { 
       System.out.println(e); 
      } 
    }           


    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JLabel jLabel4; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JTextField jTextField1; 
    private javax.swing.JTextField jTextField2; 
    private javax.swing.JTextField jTextField3; 
    // End of variables declaration     

    public String getHost(){ 
     return jTextField1.getText(); 
    } 

    public String getPort(){ 
     return jTextField2.getText(); 
    } 

    public String getUsername(){ 
     return jTextField2.getText(); 
    } 
} 

호스트에 연결 스레드 :

package tema09client; 

import java.net.*; 
import java.io.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Comunicare extends Thread{ 
    Socket client=null; 
    PrintWriter out=null; 
    BufferedReader in=null; 
    boolean listen=true; 
    String username=null; 
    String mesaj=null; 

    public Comunicare(String host, int port){ 
     try { 
      client = new Socket(host, port); 
      out=new PrintWriter(client.getOutputStream()); 
      in=new BufferedReader(new InputStreamReader(client.getInputStream())); 
      //out.println("loginStep1"); 
     } catch (UnknownHostException ex) { 
      Logger.getLogger(Comunicare.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Comunicare.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    @Override 
    public void run(){ 
     String buffer; 
     String line; 
     while(listen){ 
      try { 
       out.flush(); 
       buffer = in.readLine(); 
       if(buffer.startsWith("cheie")){ 
        System.out.println("Serverul a trimis: "+buffer); 
        if(buffer.equals("cheieOKStep1")){ 
         out.println("cheieloginStep2"); 
         System.out.println("Am trimis: loginStep2"); 
         out.flush(); 
         logare(); 
        //out.flush(); 
        } 
        if(buffer.equals("cheieLoggedIn")){ 
        System.out.println("Conectat! ... se incarca lista de prieteni online."); 
        } 
        if(buffer.equals("cheieFail")) 
         System.out.println("Username-ul nu este in baza de date."); 
        if(buffer.equals("cheieActualizarePrieteni")) 
         System.out.println("Acum se adauga prietenii in lista"); 
       } 
       if(mesaj.startsWith("cheie")){ 
        if(mesaj.equals("cheieloginStep1")) 
         out.println(mesaj); 
       } 
      } catch (IOException ex) { 
       System.out.println(ex); 
      } 
     } 
    } 

    private void logare(){ 
     out.println(username); 
     System.out.println("Am trimis: "+username); 
    } 

    public void setUname(String user){ 
     username=user; 
    } 

    public void setMesaj(String mesaj){ 
     this.mesaj=mesaj; 
    } 
} 

을 그리고 주 :

:

package tema09client; 
public class Main { 
    public static void main(String[] args) { 
     GUI fereastra=new GUI(); 
     fereastra.setVisible(true); 
    } 

} 

내가이 스택 트레이스 생각

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at tema09client.GUI.jButton1ActionPerformed(GUI.java:124) 
at tema09client.GUI.access$100(GUI.java:2) 
at tema09client.GUI$2.actionPerformed(GUI.java:48) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 

등입니다. 이것은 GUI의 124 행입니다. test = new Comunicare (host, Integer.getInteger (port));

아무도 도와 줄 수 있습니까? 추신 : 널 포인터 예외는 "연결"버튼을 누르면 발생합니다.

+3

1) 스택 추적을 게시하고 2) 관련 코드 만 게시하는 것이 좋습니다. –

+0

관련 코드를 게시하면 무엇을 의미합니까? 스택 추적을 얻으려면 어떻게해야합니까? (NetBeans에서 작업 중입니다.) –

+0

스택 추적이 콘솔 또는 "출력"에 나타나야합니다. –

답변

2

Integer.parseInt(port)이 아닌 Integer.getInteger(port)을 사용하십시오. Integer.getInteger(port)port으로 지정된 시스템 특성에서 정수를 가져 오는 데 사용되며 null을 반환하고 Integer에서 int까지 unbox이 필요하므로 NPE를 얻습니다.

또한 Null 값을 거의 아무 곳에도 확인하지 않기 때문에 코드의 여러 위치에서 NPE를 얻을 수 있습니다. null인지 확인하지 않고 out, in, socketbuffer을 사용합니다.

+0

감사합니다. MByD! 그것이 문제였습니다. 이제 괜찮아! –

+0

@Ionut 각 질문에 대한 최선의 대답을 수락하는 것을 잊지 마십시오. 좋은 응답을 upvoting하는 것도 좋은 생각입니다. –

+0

@lonut - 편집 된 답변을 읽으십시오. 중요하며, 또한 'Integer.getInteger'는 프리미티브 인'int'가 아닌'Integer' 객체를 반환합니다. – MByD

관련 문제