1

インターネット上のtutに基づいてtcp Javaクライアント/サーバーアプリを実装していますいくつかのメソッドを変更し、nullpointerexceptionのエラーが発生しました

エラーは run() から発生します。Thread クラスを拡張する Connection クラスにあります。run() は着信通信をリッスンすることになっています。サーバー クラスを開始し、ポートをリッスンします。だから私は成功した接続を持っています。次に、run() メソッドを介して着信通信をリッスンしようとすると、アプリがエラーを報告します

接続を確立して開始します。

Connection c = new Connection(host,port);
                Scanner chatConsole = new Scanner(System.in);
                String text = "";

                while (!text.equalsIgnoreCase("halt")){         
                    text = chatConsole.nextLine();
                    c.start();

スレッド「Thread-1」での例外 java.lang.NullPointerException

run()

public void run(){//watch for incoming communication
    String msg;

    try{//loop reading lines and display msg
        while ((msg = in.readLine()) != null) {
            System.out.println(msg);
        }
    }catch (IOException e) {
        System.err.println(e);
    }   
}

デバッグに役立つ場合、これはクラスのコンストラクターです。

public Connection(String iniName, int iniPort){
        host = iniName;
        port = iniPort;

        try {
            server = new Socket(host, port);
        }catch (UnknownHostException e){
            System.err.println(e);
            System.exit(1);
        }

        try{
            stdIn = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter out = new PrintWriter(server.getOutputStream(), true); //output stream to server
            BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
        }catch(Exception e){
            System.err.println(e);
        }
    }

ありがとうございました

4

2 に答える 2

2

あなたのin変数はnullです。それを使用しようとしています:

while ((msg = in.readLine()) != null) {

おそらく、それを構築する場所でそれをシャドーイングしているからです。

BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));

代わりに、変数をローカルで再宣言しないでください。

in = new BufferedReader(new InputStreamReader(server.getInputStream()));
于 2012-11-03T02:13:03.810 に答える
1

貼り付けたコードのどこにもグローバル フィールドを宣言していませんin。それは投げている行NullPointerExceptionですか?( in.readLine)。Stream が正しく初期化されていることを確認してください (つまり、コンストラクターのローカル変数ではなく、フィールドにします)。

于 2012-11-03T02:13:06.467 に答える