После 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();
}

Я не думаю, что вам нужен код моего обработчика запросов, поэтому я не буду прикреплять его, чтобы уменьшить количество спама в коде. Метод, который вызывает следующее, является обработчиком запросов

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 был брошен...

3 ответа

Решение

Починил это

я забыл добавить строку разрыва в сценарий переключения случая в моем обработчике запросов sry это была моя ошибка... спасибо за помощь мне избежать EOFException:)

Предложение:

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

Вы можете (и часто должны) помещать несколько операторов в блок 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();
}
Другие вопросы по тегам