0

チャット サーバーを実行するたびに、クライアントが接続するまで動作し、次に connections.add(socket); で Null Pointer 例外が発生します。これはクラッシュし、実行するたびにこれが発生します。これを行う方法について数か月前にチュートリアルを見たので、クライアント側が問題ないことを知っており、そのサーバーはクラッシュすることなくクライアントと連携します

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

    }

}
4

1 に答える 1

3

で NPE を取得した場合、それは nullconnections.add(socket),であることが原因である可能性があります。connections:のインスタンスを作成していないため、Server代わりに : からすべてのコードを実行しようとしていmain().ます無限再帰から。new Server()Server,StackOverflowError

このコードは本当に混乱しています:

  • 無限再帰を修正
  • メソッドServerでのインスタンスを構築するmain()
  • connections非静的にする
  • socket受け入れループでローカル変数を作成する
  • 0から反復するようにループを修正しますconnections.size()-1

そしてさらに試みる。

于 2013-08-19T01:09:19.260 に答える