0

I am working on a mini-project which consists of doing a client-server chat application. The application has a GUI and my problem is that I am trying to get the information from GUI and connect on that server, but I receive a null pointer exception. So far I have this code for the client(the server was tested without GUI client and works perfectly).

The GUI class:

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();
    }
}

The thread which connects to host:

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;
    }
}

And the main:

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

}

I think this is the stack trace:

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) 

ETC. This is line 124 from GUI: test=new Comunicare(host, Integer.getInteger(port));

Can anyone help me please? PS: The null pointer exception fires when I press "Connect" button.

Isaac Truett
  • 8,734
  • 1
  • 29
  • 48
Ionut Ungureanu
  • 380
  • 3
  • 9
  • 25
  • 3
    I suggest 1) posting the stack trace and 2) only posting relevant code. – Isaac Truett Apr 25 '11 at 23:32
  • What do you mean by posting relevant code? And how do I get the stack trace? (I am working in NetBeans) – Ionut Ungureanu Apr 25 '11 at 23:36
  • The stack trace should appear in your console or "output". – Vicente Plata Apr 25 '11 at 23:38
  • The stack trace from an uncaught exception will be printed to standard out - the shell or console. For caught exceptions, call `e.printStackTrace();` to print the stack trace to standard out By relevant code, I mean code that could actually have something to do with the exception. Find the line referenced in the stack trace and post that, maybe the whole method if it's reasonably sized. Since this is an NPE, also look for lines where any class members referenced on the NPE line are initialized. That's a start, at least. People trying to help you can ask for more code if they need it. – Isaac Truett Apr 25 '11 at 23:42
  • I think this is the stack trace: 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) ETC. This is lyne 124 from GUI: test=new Comunicare(host, Integer.getInteger(port)); – Ionut Ungureanu Apr 25 '11 at 23:44
  • @Ionut Ungureanu: Do not post your stack trace is a comment. That's unreadable. **Update** your question, please. Put the stack trace in your question. Also, please cut your code examples down to the **smallest** code which demonstrates your problem. Please **update** the question to reduce the code and include the stack trace. Then delete your hard-to-read comment. – S.Lott Apr 25 '11 at 23:57

1 Answers1

2

Use Integer.parseInt(port) and not Integer.getInteger(port). Integer.getInteger(port) is used to get integer from the system property specified by port, and since it returns null and you need to unbox the Integer to int, you get NPE.

Moreover, you might get NPE in many places in your code, since you don't check for null values almost nowhere. you use out, in, socket and buffer without checking if null.

Community
  • 1
  • 1
MByD
  • 135,866
  • 28
  • 264
  • 277
  • @Ionut Don't forget to accept the best answer to each of your questions. Upvoting any good answers is a good idea, too. – Isaac Truett Apr 25 '11 at 23:54
  • @lonut - please read the edited answer since it's important, and also, `Integer.getInteger` return `Integer` object not `int`, which is primitive. – MByD Apr 25 '11 at 23:56
  • Thank you again for all your answers! Currently I am trying to resolve all other NPEs, but it will take a while. Anyway I don't want a very complex application. It is in educational purpose. School homework. – Ionut Ungureanu Apr 26 '11 at 00:10
  • @lonut - even a better reason to make sure you cover those `null`s :) – MByD Apr 26 '11 at 00:14