4

NullPointerExceptionシリアル化されたオブジェクトが使用可能かどうかを識別し、ソケットを使用してそれを受信しようとしているときにエラーが発生します。ObjectInputStream利用可能なオブジェクトがあるかどうかを識別する方法は?最初に、テキストを読み取ってから、同じソケットのLotオブジェクト()から読み取ろうとしますが、そこにはない可能性があります。

        public class ThreadIn extends Thread{
        BufferedReader in;
            PrintStream outConsole;
            Socket socket;
            ObjectInputStream ois;
            String str;
            Lot lot;
ThreadIn(BufferedReader input, PrintStream inOutput, Socket s){
        str = "";
        in= input;
        socket= s;
        try {
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        outConsole = inOutput;

    }
    public void run() {

            while(!EXIT_THREAD){
            try {
        if(in.ready()){
            try {
                str= in.readLine();
                    Thread.sleep(100);
                } catch (IOException e) {
                EXIT_THREAD= true;
                break;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                outConsole.println("Received:"+str);

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            try {
                if((Lot)ois.readObject() != null){      
                    lot = (Lot)ois.readObject(); 
                    if (lot!=null){outConsole.println(lot.toString());} 
                    outConsole.println((String)ois.readObject());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    }
4

2 に答える 2

3
if((Lot)ois.readObject() != null)

この部分自体が Socket からオブジェクトを読み取ります。つまり、コード内で Socket からオブジェクトを 3 回読み取っていることになります。ソケットに入るオブジェクトが 1 つまたは複数の場合は、オブジェクトを読み取って例外をキャッチできます! 以下のように

 //..loop start
         try {
                lot = (Lot)ois.readObject(); 
             }
         catch (Exception e) 
           { 
//      do some handling, skip the object! put a continue: or something

            }
    //do what ever you want to do with `lot`

    //..loop end

そして今、コードに従って、ObjectInputStreamオブジェクトを初期化していません。

するObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

ここでコードを省略した場合は、私の間違いです。それ以外の場合は、ソケットも初期化してください。

于 2012-06-05T06:29:57.210 に答える
1

削除されたものを含む他の回答によると、readObject()2回呼び出して最初の結果を捨てています。でブロックできるように、コードを再編成する必要がありますreadObject()

他にも問題があります。readObject()forの結果をテストしていますが、送信者にa を書いた場合null?にのみ返されます。これを EOS テストとして使用していると思われますが、無効です。EOSに投げます。でブロックできるように、コードを再編成する必要があります。nullnullreadObject()EOFExceptionreadObject()

于 2012-06-05T08:00:19.710 に答える