Search code examples
socketsnullpointerexceptionmaze

Why I get null.pointer exception, I am sure where aren't any null variables


public class Server {

public static Maze lab;
public static Socket s;
public static Socket z;
public static player human;
public static BufferedReader input;
public static OutputStream os;
public static InputStream is;
public static int n=-1;
public static connections info;
public static ObjectOutputStream oos;


public static void main(String[] args) {
    try{
    ServerSocket Serversocket = new ServerSocket(1900);
    System.out.println("Maze Game Server Started on port " + Serversocket.getLocalPort());
    FileInputStream fis = new FileInputStream("labirintas.cfg");
    ObjectInputStream ois = new ObjectInputStream(fis);
    lab = (Maze) ois.readObject();
    fis.close();
    ois.close();
    info = new connections();
    try {
        while(true){
        try{
        s = Serversocket.accept();
        z = Serversocket.accept();
        System.out.println("Conection from: " + s.getLocalAddress().getHostAddress());
        os = s.getOutputStream();
        is = z.getInputStream();
        oos = new ObjectOutputStream(os);
        oos.writeObject(lab);
        oos.flush();
        n++;
        //is.close();            
        human = new player(n);
        human.start();
        }catch(Exception exception){
            System.out.println("nėra labirinto" + exception.getMessage());
            System.exit(0);
        }finally
        {
            s.close();
        }
        }
    } catch ( Exception ex) {
        System.out.println(ex.getMessage());
    }

}catch(Exception e){
    System.out.println(e.getMessage());
}
}

public static class player extends Thread{
public int x=0;
public int y=0;
public int counter = 0;
public String nick="";

public player(int n){
    x=0;
    y=0;
    counter = n;
    try{
        input = new BufferedReader(new InputStreamReader(is));
        nick = input.readLine();
        System.out.println(counter+" "+x+" "+y+" "+ nick );
        info.info(counter, x, y, nick);
        oos.writeObject(info);
        oos.flush();
        }catch(Exception e){
        System.out.println(e.getStackTrace());
        }
}

public int getcooX(){
    return x;
}

public int getcooY(){
    return y;
}

public void moveUP(){
    x--;
}

public void moveDOWN(){
    x++;
}

public void moveLEFT(){
    y--;
}

public void moveRIGHT(){
    y++;
}

@Override
public void run(){
    try{
        while(true){
            System.out.println(s + " with name: "+ nick + ": " + (s.isConnected()?"true":"false"));
            if (input!=null){
            String command = input.readLine();
            System.out.println(command);
            if(command.startsWith("MOVE_UP")){
                System.out.println("up move");
                if (lab.checkUP(x, y)==false){
                    System.out.println("up accepted");
                    x--;
                    info.info(counter, x, y, nick);
                    oos.writeObject(info);
                    oos.flush();
                }
                if(lab.isItWin(x, y)){
                    System.out.println("Winner");
                    s.close();
                }
            }
            else if(command.startsWith("MOVE_LEFT")){
                System.out.println("left move");
                if (lab.checkLEFT(x, y)==false){
                    System.out.println("left accepted");
                    y--;
                    info.info(counter, x, y, nick);
                    oos.writeObject(info);
                    oos.flush();
                }
                if(lab.isItWin(x, y)){
                    System.out.println("Winner");
                    s.close();

                }
            }
            else if(command.startsWith("MOVE_RIGHT")){
                System.out.println("right move");
                if (lab.checkRIGHT(x, y)==false){
                    System.out.println("right accepted");
                    y++;
                    info.info(counter, x, y, nick);
                    oos.writeObject(info);
                    oos.flush();
                }
                if(lab.isItWin(x, y)){
                    System.out.println("Winner");
                    s.close();
                }
            }
            else if(command.startsWith("MOVE_DOWN")){
                System.out.println("down move");
                if (lab.checkRIGHT(x, y)==false){
                    System.out.println("down accepted");
                    y++;
                    info.info(counter, x, y, nick);
                    oos.writeObject(info);
                    oos.flush();
                }
                if(lab.isItWin(x, y)){
                    System.out.println("Winner");
                    s.close();
                }
            }
            }
        }
    }catch(Exception e){
       System.out.println(e.getMessage());
    }
    }
}
}

Why do I get java.lang.NullPointerException? I think I'm doing everything right. I don't understand why I get this. here the client, and the connections classes.

public class Client implements ActionListener, Serializable{
 public static JFrame main;
 public static JPanel mainP;
 public static JLabel text;
 public static JButton New;
 public static JButton exit;
 public static JTextField nickas;
public JPanel labirintas;
public JMenuBar bar;
public JMenu file;
public JMenu edit;
public JMenuItem close;
public JFrame kurti;
public JLabel[][] label;
public JFrame zaidimas;
public static Maze lab;
public Color sienos = Color.BLACK;
public Color zaidejo = Color.RED;
public Color laimejimo = Color.GREEN;
public Color laukeliai = Color.WHITE;
public int cooX = 0;
public int cooY = 0;
public static PrintWriter output;
public static Socket s;
public static Socket f;
public static connections info;
public static InputStream os;
public static ObjectInputStream oos;

public static void main(String[] args) {
    main = new JFrame("Pagrindinis meniu");
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainP = new JPanel();
    text = new JLabel("Sveiki čia labirinto žaidimas. Įveskite savo vardą. Pasirinkite ką"
            + " darysite", SwingConstants.CENTER);
    text.setVerticalAlignment(SwingConstants.TOP);
    New = new JButton("Pradėti žaidimą");
    nickas = new JTextField();
    nickas.setDocument(new JTextFieldLimit(10));

    mainP.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
    c.insets = new Insets(10,0,0,0);
    mainP.add(text, c);

    c.gridx=0;
    c.gridy = 1;
    mainP.add(nickas, c);

    c.gridx = 0;
    c.gridy = 2;
    mainP.add(New, c);

    exit = new JButton("Išeiti iš žaidimo");
    c.gridx = 0;
    c.gridy = 3;
    mainP.add(exit, c);

    main.add(mainP);
    main.setSize(500, 500);
    main.show();

    New.addActionListener(new Client());
    exit.addActionListener(new Client());
}

@Override
public void actionPerformed(ActionEvent e){
    Object source =e.getActionCommand();
    if (source.equals("Pradėti žaidimą")){
        String nick = nickas.getText();
        try{
            if(nick.isEmpty()){
                JOptionPane.showMessageDialog(main, "Enter Your name", "Please Enter Your name", JOptionPane.ERROR_MESSAGE);
            }
            else{
        s = new Socket("localhost",1900);
        f = new Socket("localhost",1900);
        os = s.getInputStream();
        oos = new ObjectInputStream(os);
        lab = (Maze) oos.readObject();
        OutputStream is = f.getOutputStream();
        //os.close();
        output = new PrintWriter(is, true);


        main.show(false);
        zaidimas =new JFrame("Labirinto kurimas");//sukuriu nauja frame labirinto zaidimui
            zaidimas.setLayout(new GridBagLayout());
            zaidimas.setBackground(Color.BLACK);
            GridBagConstraints ck = new GridBagConstraints(); //sukuriu nauja GridBagConstraints stiliui kurti
            ///////////////////// 
            zaidimas.setSize(1200, 600);
            bar = new JMenuBar();//meniu juosta
            file = new JMenu("File");
            edit = new JMenu("Edit");
            /////////////////////
            bar.add(file);
            bar.add(edit);
            file.add(close = new JMenuItem("Close"));
            close.setAccelerator(KeyStroke.getKeyStroke('C', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
            //////////////////
            JMenuItem spalvos = new JMenuItem("Spalvų meniu");
            edit.add(spalvos);
            spalvos.setAccelerator(KeyStroke.getKeyStroke('P', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
            /////////////////
            ck.gridx = 0;//pridedu ja i tokias koordinates
            ck.gridy = 0;
            ck.fill = GridBagConstraints.HORIZONTAL;//issitemptu horizontaliai
            ck.anchor = GridBagConstraints.NORTHWEST;
            ck.gridwidth = 4;
            ck.weightx = 1.0;
            ck.weighty = 0.0;
            zaidimas.add(bar, ck);
            /////////////////////

            labirintas = new JPanel();//labirinto panele
            labirintas.setLayout(new GridLayout(lab.h,lab.v));
            ck.gridy = 1;
            ck.weightx = 0.8;
            ck.weighty = 1.0;
            ck.fill = GridBagConstraints.BOTH;
            zaidimas.add(labirintas, ck);
            /////////////////////
            text = new JLabel("Online:");
            ck.gridx = 4;
            ck.weightx = 0.2;
            ck.weighty=1.0;
            ck.fill = GridBagConstraints.BOTH;
            ck.anchor = GridBagConstraints.FIRST_LINE_START;

            zaidimas.add(text, ck);
            ////////
            label = new JLabel[lab.h][lab.v];//sukuriu masyva labeliu
            ////////////////
            sienos();
            ///////////////
            label[0][0].setBackground(zaidejo);
            ///////////////
            try{
                output.println(nick);
                online();
            }catch(Exception b){

            }

         zaidimas.addKeyListener(new KeyListener(){
               @Override
               public void keyReleased(KeyEvent K){
                   try{
                  if (K.getKeyCode()==KeyEvent.VK_A){
                     output.println("MOVE_LEFT");
                     output.flush();
                     if (lab.checkLEFT(cooX, cooY)==false){
                     label[cooX][cooY].setBackground(Color.white);
                     cooY--;
                     online();
                     }
                     if(lab.isItWin(cooX, cooY)){
                         JOptionPane.showMessageDialog(main, "Winner!", "You Won.", JOptionPane.PLAIN_MESSAGE);
                        System.out.println("Winner");
                        s.close();
                        f.close();
                        System.exit(0);
                    }
                 }
                  else if (K.getKeyCode()==KeyEvent.VK_W){
                        output.println("MOVE_UP");
                        output.flush();
                        if (lab.checkUP(cooX, cooY)==false){
                        label[cooX][cooY].setBackground(Color.white);
                        cooX--;
                        online();
                        }
                        if(lab.isItWin(cooX, cooY)){
                            JOptionPane.showMessageDialog(main, "Winner!", "You Won.", JOptionPane.PLAIN_MESSAGE);
                        System.out.println("Winner");
                        s.close();
                        f.close();
                        System.exit(0);
                        }
                    }
                  else if (K.getKeyCode()==KeyEvent.VK_D){
                     output.println("MOVE_RIGHT");
                     output.flush();
                     if (lab.checkRIGHT(cooX, cooY)==false){
                     label[cooX][cooY].setBackground(Color.white);
                     cooY++;
                     online();
                     }
                     if(lab.isItWin(cooX, cooY)){
                         JOptionPane.showMessageDialog(main, "Winner!", "You Won.", JOptionPane.PLAIN_MESSAGE);
                        System.out.println("Winner");
                        s.close();
                        f.close();
                        System.exit(0);
                    }
                    }
                    if (K.getKeyCode()==KeyEvent.VK_S){
                     output.println("MOVE_DOWN");
                     output.flush();
                     if (lab.checkDOWN(cooX, cooY)==false){
                     label[cooX][cooY].setBackground(Color.white);
                     cooX++;
                     online();
                     }
                     if(lab.isItWin(cooX, cooY)){
                         JOptionPane.showMessageDialog(main, "Winner!", "You Won.", JOptionPane.PLAIN_MESSAGE);
                        System.out.println("Winner");
                        s.close();
                        f.close();
                        System.exit(0);
                    }
                    }
                   }catch(Exception ex){   
                   }
               }
               public void keyPressed(KeyEvent key){}
               public void keyTyped(KeyEvent keyE){}
          });
            ///////////////
            zaidimas.show();

            close.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                        zaidimas.dispose();
                        main.dispose();
                        System.exit(0);
                }
            });
            zaidimas.addWindowListener(new WindowAdapter(){
                @Override
                public void windowClosing(WindowEvent wind){
                   main.show(true);
                   mainP.show(true);
                   try{
                   s.close();
                   f.close();
                   }catch(Exception ex){

                   }
                }
            });
            }
    }catch(UnknownHostException exception){
            JOptionPane.showMessageDialog(main, exception.getMessage()+exception, "Host error", JOptionPane.ERROR_MESSAGE);
            exception.getStackTrace();
        }
        catch(Exception except){
            JOptionPane.showMessageDialog(main, except.getMessage()+except, "Fatal error", JOptionPane.ERROR_MESSAGE);
            except.getStackTrace();
        }
    }
    else if (source.equals("Išeiti iš žaidimo")){
        main.dispose();
        System.exit(0);
    }
}





 //   public void gamer(){//tikrina ar zaidejas yra laimejimo langelija
  //      label[game.getcooX()][game.getcooY()].setBackground(zaidejo);
  //                  if (lab.isItWin(game.getcooX(), game.getcooY())){
  //                      zaidimas.dispose();
  //                      JOptionPane.showMessageDialog(main, "Jūs laimėjote!", "Sveikiname", JOptionPane.ERROR_MESSAGE);
  //                      main.show(true);
  //                      mainP.show(true);
  //                  }
 //   }

    public void sienos(){
        for(int i=0;i<lab.h;i++){
                    for(int j=0; j<lab.v;j++){//ciklas braizyti sienom
                        label[i][j] = new JLabel();
                        int t=0,r=0,bot=0,l = 0;//i sias reiksmes isirasysiu sienu ploti
                        if (i==0){
                           if(lab.checkUP(i, j)) t=5; //tikrina ar borderis, jei borderis, tai storesne siena, jei ne, tai plonesne
                        }
                        else {
                            if(lab.checkUP(i, j)) t=2;
                        } 
                        if (i==lab.h-1){
                            if(lab.checkDOWN(i, j)) bot=5;
                        }
                        else{
                            if(lab.checkDOWN(i, j)) bot=2;
                        }
                        if(j==lab.v-1){
                            if(lab.checkRIGHT(i, j)) r=5;
                        }
                        else{
                            if(lab.checkRIGHT(i, j)) r=2;
                        }
                        if (j==0){
                            if(lab.checkLEFT(i, j)) l=5;  
                        }
                        else{
                        if(lab.checkLEFT(i, j)) l=2;
                    }
                    label[i][j].setBorder(BorderFactory.createMatteBorder(t, l, bot,r , sienos));
                    label[i][j].setOpaque(true); //kad matytusi labelis
                    if(lab.isItWin(i, j)) label[i][j].setBackground(laimejimo);
                    else label[i][j].setBackground(laukeliai);
                    labirintas.add(label[i][j]);
                }
            }
}
public void online(){
    try{
        info = (connections) oos.readObject();
    }catch(Exception e){
    System.out.println(e.getCause());}
    text.setText("Online:");
    for (int i=0;i<info.names.length;i++){
        text.setText(text.getText() + "\n" + info.names[i]);
        label[info.x[i]][info.y[i]].setBackground(Color.gray);
        if(lab.isItWin(info.x[i], info.y[i])) label[info.x[i]][info.y[i]].setBackground(laimejimo);
        label[cooX][cooX].setBackground(Color.white);
    }
}
}


    public class connections {
        public String[] names;
        public int[] x;
        public int[] y;

        public void connections(){
            names = new String[99];
            x = new int[99];
            y = new int[99];
            for (int i=0;i<100;i++){
                names[i]="";
                x[i]=0;
                y[i]=0;
            }
        }

        public void info(int n,int x,int y,String name){
            names[n]=name;
            this.x[n]=x;
            this.y[n]=y;
        }
    }

Here's what I get from stacktrace:

java.lang.NullPointerException
at client.connections.info(connections.java:24)
at server.Server$player.<init>(Server.java:90)
at server.Server.main(Server.java:57)

Solution

  • The class connections does not have a constructor so the variable names never gets initialized. So when you call the method info and it tries to set names[n]=name it throws a NullPointerException because names is still null.

    It looks like you have a constructor because you have a method named connections which is the same as the class name. However, you gave the method a return type of void which prevents it from being a constructor as constructors do not have a return type.

    Change that line to:

    public class connections {
        public connections(){
            ...
    

    You will now get a NullPointerException because you are attempting to set the 100th location of your names array in your constructor of the connections class.

    You create the names array with length 99.

    Then your for loop iterates through the numbers 0 through 99 (less than 100).

    The problem is that the highest allowable index of names is 98 which is the 99th location. So when you try to set names[99] = "" it throws a NullPointerException.

    Change your for loop to only go up to 99 instead of 100:

    public connections(){
        names = new String[99];
        x = new int[99];
        y = new int[99];
        for (int i=0;i<99;i++){
            names[i]="";
            x[i]=0;
            y[i]=0;
        }
    }
    

    Or change the arrays to be length 100 to match the for loop:

    public connections(){
        names = new String[100];
        x = new int[100];
        y = new int[100];
        for (int i=0;i<100;i++){
            names[i]="";
            x[i]=0;
            y[i]=0;
        }
    }
    

    Java Class Names

    In Java the convention is to name all classes with mixed case with the first letter capitalized. See Java Naming Convention

    Methods should be name with mixed case with the first letter lowercase.

    You should change your connections class as follows:

    public class Connections {
        public Connections(){
            ...