Java执行流读取抛出Stream is closed异常,附代码咨询触发原因
Stream closed异常原因分析
出现该异常的核心原因是执行第二个reader.read()操作时,reader关联的底层输入流已经处于关闭状态,具体可分为以下几类场景:
- 异常捕获逻辑不完整
你当前的代码只针对第一个try块的SocketTimeoutException做了捕获和资源关闭处理,如果第一个reader.read(msg1,0,6)执行过程中抛出了其他IOException子类,会直接向上抛出,如果上层调用逻辑的finally块中执行了socket、流的关闭操作,就会导致第二个try块执行时流已经被关闭。 - 服务端主动断开TCP连接
如果第一个read读取的6个字符已经是服务端返回的全部响应数据,服务端在发送完所有数据后主动关闭了TCP连接,此时客户端socket关联的输入流会被标记为关闭状态,第二个read操作发起时就会抛出Stream closed异常。 - 共享资源被其他线程修改
如果reader、client这些资源是多线程共享的,其他线程在第一个read执行完成后、第二个read执行前调用了资源的close方法,也会触发该异常。
优化建议
- 完善异常捕获逻辑,可在
SocketTimeoutException的catch分支后追加捕获通用IOException,避免漏处理其他IO异常 - 执行read操作前先校验
reader是否为null、socket是否处于连接状态,再执行读取操作 - 确认服务端的响应数据总长度是否和你两次读取的总长度匹配,避免因服务端发完数据主动断连导致的异常
内容的提问来源于stack exchange,提问作者divya rajamohan
相关产品推荐
相关产品推荐

