这个博客解决了我的疑惑:https://www.cnblogs.com/yiwangzhibujian/p/7107084.html
我出现的原因主要是我使用了ObjectInputStream和ObjectOutputStream流,传递对象的方式传递数据。并且,我在catch中做了关闭流和socket的操作,导致出现这个异常后,就无法继续后面的流程了。
解决方式:
1、单独catch,与别的异常处理方式区分开
2、使用别的输入输出流代替ObjectInputStream的形式的流。
下面是使用方式一的简单示例。
客户端发送:
public void send(User user){
try{
ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
oos.writeObject(user);
oos.flush();
}catch (Exception e) {
}finally {
if(oos!=null){
oos.close();
}
}
}
服务端接收:(其实在捕获的Exception中是包含EOFException的,但是我在Exception中做了一些流的关闭等操作,所以就会有java.io.EOFException异常的出现)
public void receive(){
try{
ObjectInputStream ois = new ObjectInputStream(serverSocket.getInputStream());
User user = (User) ois.readObject();
}catch(EOFException eof){
//单独捕获这个异常
}catch (Exception e) {
//这里再做先前的流和socket的关闭,就不会因EOFException的问题,而导致程序中断的问题了。
}finally {
if(ois!=null){
ois.close();
}
}
}
注:代码中的User是要发送的对象类,实现了Serializable接口。
另:
在使用objectOutputStream和ObjectInputStream时,也有时会有java.lang.ClassCastException的异常,这个通过输出的日志,很容易可以知道,是因为,客户端和服务端创建的对象类不同,不仅类名要相同,包名也要相同。
博客介绍了EOFException异常的解决办法。该异常因使用ObjectInputStream和ObjectOutputStream流传递对象,且在catch中关闭流和socket导致。解决方式一是单独catch,与其他异常区分处理;二是用别的输入输出流代替。此外,还提到使用相关流时可能出现ClassCastException,原因是客户端和服务端对象类不同。

1万+

被折叠的 条评论
为什么被折叠?



