这个博客解决了我的疑惑: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的异常,这个通过输出的日志,很容易可以知道,是因为,客户端和服务端创建的对象类不同,不仅类名要相同,包名也要相同。