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