-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();
}    

如果您需要更多信息代码等,我期待您的帮助。 :) 这是退出客户端后抛出的下面的异常

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 后餐厅仍然为空......

4

3 回答 3

0

建议:

public void run(){
   try(
      ObjectInputStream  ois =
         new ObjectInputStream ( clientside.getInputStream ());
      ObjectOutputStream oos =
         new ObjectOutputStream( clientside.getOutputStream())) {
      handleRequest( ois, oos );
   }
   catch( IOException e ) {
      e.printStackTrace();
   }
}

void handleRequest( ObjectInputStream ois, ObjectOutputStream oos ) {
   try( BufferedReader fr =
           new BufferedReader( new FileReader( "Restaurant.txt" ))) {
      String tempRestaurant = fr.readLine();
      System.out.println( tempRestaurant );
   }
   catch (IOException e) {
      e.printStackTrace();
   }
}

try-with-resource 关闭声明的Closeabletry( )

于 2013-08-31T15:24:36.270 回答
0

如果它们具有常见的异常处理要求,您可以(并且通常应该)将多个语句放在一个 try 块中;例如

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

但另一方面是,当您处理异常时,您需要确保异常处理程序执行正确的操作。打印堆栈跟踪,然后像什么都没发生一样继续,这很少是正确的做法。例如,在您的原始run()方法中,如果IOException打开流,您的代码仍将尝试调用handlerequest... 传递它ois和/或oos(可能) 的实例null。这不是正确的做法!

最后,如果您使用的是 Java 7,您可以在单个处理程序中捕获多个异常;例如

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

修复

我忘了在我的请求处理程序中的 switch case szenario 中添加断线,这是我的错...谢谢帮助我避免 EOFException :)

于 2013-09-01T09:12:56.667 回答