-1

クライアント セッションを終了すると EOFException がスローされますが、これは正常であると読んだので、同じ機能を持つ新しいスレッドを開始しますが、値は Restaurant=null; です。私は.txtファイルに書きましたが

public void run(){

    try {
        ois= new ObjectInputStream(clientside.getInputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        oos = new ObjectOutputStream(clientside.getOutputStream());
    } catch (IOException e3) {
        // TODO Auto-generated catch block
        e3.printStackTrace();
    }

    handlerequest(ois,oos);// exit();
}

私のリクエスト ハンドラのコードが必要だとは思わないので、コード スパムを減らすために添付しません。以下を呼び出すメソッドは requesthandler です

String tempRestaurant=null;  
try {
    fr = new FileReader("Restaurant.txt");
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    fr.read(cbuf);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
tempRestaurant=String.valueOf(cbuf);
System.out.println(tempRestaurant);
try {
    oos.writeObject(tempRestaurant);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    try {
    fr.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}    

より多くの情報コードなどが必要な場合は、pls の書き込みをお待ちしております:) これは、クライアントを終了した後にスローされる以下の例外です。

java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at prealphaserverpackage.clientsidethreads.setRestaurant(Serverpart.java:164)
    at prealphaserverpackage.clientsidethreads.handlerequest(Serverpart.java:205)
    at prealphaserverpackage.clientsidethreads.run(Serverpart.java:96)
Exception in thread "Thread-3" java.lang.NullPointerException
    at java.io.PrintWriter.write(Unknown Source)
    at prealphaserverpackage.clientsidethreads.setRestaurant(Serverpart.java:177)
    at prealphaserverpackage.clientsidethreads.handlerequest(Serverpart.java:205)
    at prealphaserverpackage.clientsidethreads.run(Serverpart.java:96)

あなたのコードを知っていることを追加しましたが、EOFExceptionがスローされた後もレストランはnullです...

4

3 に答える 3

0

複数のステートメントに共通の例外処理要件がある場合は、try ブロック内に複数のステートメントを配置できます (多くの場合そうすべきです)。例えば

try {
    ois = new ObjectInputStream(clientside.getInputStream());
    oos = new ObjectOutputStream(clientside.getOutputStream());
    handlerequest(ois,oos);
} catch (IOException ex) {
    ex.printStackTrace();
}

しかし、反対に、例外を処理するときは、例外ハンドラーが正しいことを行うことを確認する必要があります。スタック トレースを出力して、何も起こらなかったかのように続行することは、ほとんどの場合正しいことではありません。たとえば、元のrun()メソッドでIOExceptionストリームを開く場合、コードはまだ呼び出しを試みます...それおよび/または(おそらく)インスタンスをhandlerequest渡します。それは正しいことではありません。oisoosnull

最後に、Java 7 を使用している場合は、1 つのハンドラーで複数の例外をキャッチできます。例えば

String tempRestaurant=null;  
try {
    fr = new FileReader("Restaurant.txt");
    fr.read(cbuf);
    tempRestaurant = String.valueOf(cbuf);
    System.out.println(tempRestaurant)
    someOtherMethod(); ; 
    oos.writeObject(tempRestaurant);
    fr.close();
} catch (IOException, SomeOtherException ex) {
    ex.printStackTrace();
}

「リソースで試す」を使用して、完了したら自動的にそれらを閉じることができます。

String tempRestaurant=null;  
try (FileReader fr = new FileReader("Restaurant.txt")) {
    fr.read(cbuf);
    tempRestaurant = String.valueOf(cbuf);
    System.out.println(tempRestaurant);
} catch (IOException ex) {
    ex.printStackTrace();
}
于 2013-08-31T15:29:04.673 に答える
-1

修正しました

リクエストハンドラーのスイッチケースszenarioにブレークラインを追加するのを忘れていました。私のせいでした... EOFExceptionを回避するのを手伝ってくれてありがとう:)

于 2013-09-01T09:12:56.667 に答える