Java Socket ArrayList NullPointer异常

时间:2013-08-19 00:33:45

标签: sockets arraylist nullpointerexception

每当我运行我的聊天服务器时,它一直工作,直到客户端连接,然后我得到一个空指针异常 connections.add(插座); 它会崩溃然后每次运行都会发生这种情况。 我知道我的客户端很好,因为几个月前我看了一个关于如何做这个的教程,并且该服务器可以与我的客户端一起使用而不会崩溃

private static ServerSocket server;
private static Socket socket;
private static Scanner input;
private static PrintWriter output;

private static final int port = 444;
private static String message;
private static ArrayList<Socket> connections;
private static Server serverClass;

public Server() {

    message = "";
    connections = new ArrayList<Socket>();
    serverClass = new Server();

}

public void run() {

    try {

        try {

            input = new Scanner(socket.getInputStream());
            output = new PrintWriter(socket.getOutputStream());

            while(true) {

                checkConnection();

                if(!input.hasNext()) {

                    return;

                }

                message = input.nextLine();
                System.out.println("Client said: " + message);

                for(int i = 1; i <= connections.size(); i++) {

                    Socket tempSock = (Socket) connections.get(i - 1);
                    output.println(message);
                    output.flush();

                }

            }

        }
        finally {

            socket.close();

        }

    }
    catch(Exception e) {

        System.out.print(e);

    }

}

public void checkConnection() throws IOException {

    if(!socket.isConnected()) {

        for(int i = 1; i <= connections.size(); i++) {

            if(connections.get(i) == socket) {

                connections.remove(i);

            }

        }

        for(int i = 1; i <= connections.size(); i++) {

            Socket disconnectedUser = (Socket) connections.get(i - 1);
            System.out.println(disconnectedUser + " has Disconnected!");

        }

    }

}

public static void main(String[] args) throws IOException{

    try {

        server = new ServerSocket(port);
        System.out.println("Waiting for Clients... ");

        while(true) {

            socket = server.accept();
            connections.add(socket);
            System.out.println("Client connected from: " + socket.getLocalAddress().getHostName());

            Thread thread = new Thread(serverClass);
            thread.start();

        }

    }
    catch(Exception e) {

        e.printStackTrace();

    }

}

1 个答案:

答案 0 :(得分:3)

如果您在connections.add(socket),获得NPE,则只能因为connections为空。它是什么,因为你没有构建Server的实例:而是你试图从main().执行它的所有代码。你调用new Server()的唯一地方是在构造函数中Server,你根本没有执行过,因为你会从无限递归中获得StackOverflowError

这段代码真是一团糟:

  • 修复无限递归
  • Server方法
  • 中构建main()的实例
  • 使connections非静态
  • 在接受循环中使socket成为局部变量
  • 修复您的循环以从0迭代到connections.size()-1

再试一次。