0

だから私はクライアントからデータを受信するためのスレッドを持っています。このデータを読み取る ObjectInputReader があります。ObjectInputReader を try-catch で初期化できなかった場合、クライアントがサーバーに通知せずに切断した場合、try-catch は例外を呼び出す必要があります。

そのため、Catch-Statement で「クライアントの切断」処理を行いました。しかし、それは決して起こりません。

しかし、デバッグでサーバーを実行していて、Catch-Statement にブレークポイントを設定すると、例外が発生し、すべてが希望どおりに処理されます。ただし、ブレークポイントがある場合のみであり、ない場合 (デバッグまたはリリース) はありません。

私は日食を使用しています。最新バージョンだと思います。

誰かがこの「バグ」に遭遇したことがありますか? それとも私は何か間違ったことをしていますか?

private static Runnable receive = new Runnable(){

    @Override
    public void run() {
        // TODO Auto-generated method stub
        ObjectInputStream ois;

        while(true)
        {
            for(int i = 0; i < listSockets.size();i++){
                try {
                    ois = new ObjectInputStream(listSockets.get(i).getInputStream());
                    int receiveState = (Integer)ois.readObject();

                    DataPackage dp = (DataPackage)ois.readObject();

                    listData.set(i,dp);

                    if(receiveState == 1){ //client disconnected by user
                        disconnectClient(i);
                        i--;
                    }

                    ois.close();
                } catch (IOException | ClassNotFoundException e) {
                    disconnectClient(i);
                    i--;
                }

            }
        }
    }


};
4

1 に答える 1

0

デバッグはプログラムに影響を与える可能性があることに常に留意してください。特に変数を調べると、jvm によって多くの toString() メソッドが呼び出されます。1 つの toString() メソッドがいずれかのオブジェクトの状態を変更すると、結果が変更されます。次のようなものを試してください

} catch (IOException | ClassNotFoundException e) {
      System.out.println("I am here");
      disconnectClient(i);
      i--;
}

プログラムが実際に catch ブロックにジャンプするかどうか、または disconnectClient メソッドに欠陥があるかどうかを確認します。System.out をさらにいくつか追加すると、. Programmが停止したことがわかります。

于 2013-02-21T10:22:03.063 に答える