在EOFException之后变量= null

时间:2013-08-31 15:13:46

标签: java variables client-server filewriter eofexception

如果我结束客户端会话,则抛出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之后仍然是餐厅null ...

3 个答案:

答案 0 :(得分: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关闭try( )

中声明的Closeable

答案 1 :(得分:0)

如果它们有共同的异常处理要求,您可以(通常应该)在try块中放置多个语句; e.g。

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,则可以在单个处理程序中捕获多个异常; e.g。

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

答案 2 :(得分:-1)

修正了

我忘了在我的请求处理程序中添加断开行szenario中的断行sry这是我的错... thx帮助我避免EOFException:)