0

私はチャットルームを持っていて、以前は機能していましたが、コードを少し変更していくつかのことを試してみましたが、機能しなかったため、元のコードに戻そうとしましたが、何が間違っていたのかわかりません。現在、NullPointerException がスローされています。私のコードには、PrintWriters の ArrayList と、それが示すように行うメソッド showAll() があります。チャットルームのすべての人にメッセージを送信します。基本的に、私が疑問に思っているのは、どうして例外が発生するのかということです。

    //This is the main code, used to add printwriters to the arraylist and to connect to clients
    //The Communicate thread is used to get input from users and use the showAll() method with that input
    public void listen() {
        listWriters = new ArrayList<PrintWriter>();
        try {
            scanner = new Scanner(System.in);
            portnum = getPortNumber(scanner);
            System.out.println("Listening on " + portnum);
            serverSocket = new ServerSocket(portnum);
            while(true) {
                clientcommunicate = serverSocket.accept();
                System.out.println("Connection accepted: " + clientcommunicate.toString());

                PrintWriter client = new PrintWriter(clientcommunicate.getOutputStream(), true);
                listWriters.add(client);
                Thread t = new Thread(new Communicate(clientcommunicate));
                t.start();
            }
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.err.println("Error.");
            System.exit(1);
        }
    }

    //This uses a printwriter obtained in the Communicate thread; the thread initializes a socket in it with the socket obtained in the constructor
    public void showAll(String msg, PrintWriter printwriter) {
        for(int i = 0; i < listWriters.size(); i++) { //this is where the exception is thrown
            if(!listWriters.get(i).equals(printwriter)) { //if I change the paramater listWriters.size() to a regular integer like 3, and only create 2 clients or even less, the exception is thrown here instead
                listWriters.get(i).println(msg);
            }
        }
    }

編集:

わかりましたので、エラーはもう発生していませんが、メッセージを送信できないようです。クライアント側からメッセージを送信すると、エラーは発生しませんが、どちらのクライアントにもメッセージが表示されません。

4

3 に答える 3

6

NullPointerExceptionである変数を逆参照 (つまり、メソッドを呼び出したり、フィールドを読み取ったり) しようとしているため、スローされていますnull

この場合、listWritersnull であることは明らかです (例外が発生した行で逆参照される唯一の変数であるため、文字を探します.)。これはメソッドで割り当てられるため、 を呼び出す前に呼び出すlisten()と、このエラーが発生すると思います。showAll() listen()

listWriters非常に単純なフィールドは、null になることがないように、その宣言で空のリストに割り当てることです。

private List<PrintWriter> listWriters = new ArrayList<PrintWriter>();

アプリケーションの同時実行要件によっては、より複雑なことを行う必要がある場合がありますが、一般的な原則として、読み取りを試みるlistWriters 前に初期化する必要があります。

于 2012-10-22T11:07:39.147 に答える
0

showAllメソッドの前にメソッドを呼び出す必要がありますlisten。メソッドの前にメソッドListWriters内で初期化されていません。listenshowAll

于 2012-10-22T11:08:10.757 に答える
0

listWritersこれは、内部listen()メソッドを初期化したことが原因である可能性があります。

したがって、showAll()メソッドがメソッドの前に呼び出されると、値listen()が取得されます (インスタンス変数として宣言し、そこで初期化していないと仮定します)。nulllistWriterslistWriters

initializing宣言した場所で試すことができます。

private List<PrintWriter> listWriters = new ArrayList<PrintWriter>();
于 2012-10-22T11:08:28.480 に答える