为什么我得到 null.pointer 异常,我确定哪里没有任何空变量

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

为什么我会得到 java.lang.NullPointerException?我认为我做的一切都是对的。我不明白为什么我得到这个。 这里是客户端,连接 类.

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

这是我从堆栈跟踪中得到的:

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)

class connections 没有构造函数,因此变量 names 永远不会被初始化。因此,当您调用方法 info 并尝试设置 names[n]=name 时,它会抛出 NullPointerException,因为 names 仍然为空。

看起来你有一个构造函数,因为你有一个名为 connections 的方法,它与 class 名称相同。但是,您为该方法提供了 return 类型的 void ,这会阻止它成为构造函数,因为构造函数没有 return 类型。

将该行更改为:

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

您现在将得到 NullPointerException,因为您试图在 connections class.

的构造函数中设置 names 数组的第 100 个位置

您创建了长度为 99 的 names 数组。

然后您的 for 循环遍历数字 0 到 99(小于 100)。

问题是names的最高允许索引是98,也就是第99个位置。因此,当您尝试设置 names[99] = "" 时,它会抛出 NullPointerException。

将您的 for 循环更改为仅达到 99 而不是 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;
    }
}

或者将数组的长度更改为 100 以匹配 for 循环:

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 姓名

在 Java 中,惯例是将所有 class 命名为混合大小写,首字母大写。参见 Java Naming Convention

方法名称应为大小写混合且首字母小写。

您应该按如下方式更改您的 connections class:

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