解决okhttp3提示java.lang.IllegalStateException:closed异常问题

 更新时间:2025年07月16日 08:42:46   作者:一缕纯氧  
使用OkHttp3时,response.body().string()只能调用一次,重复调用会导致流关闭异常,解决方法是保存响应体内容到变量或重新构建Response对象,避免多次读取

okhttp3提示java.lang.IllegalStateException:closed异常

使用okhttp3的response.body().string()时候提示java.lang.IllegalStateException: closed异常

原因为okhttp3请求回调中response.body().string()只能有效调用一次,而我使用了两次,所以在第二次时调用时提示已关闭流的异常。

		Response response = httpClient.newCall(request).execute();
        logger.info(response.body().string()); //一次
        Map<String,Object> resMap=objectMapper.readValue(response.body().string(),Map.class); //两次

解决办法

将返回的值保存在对象中,重复使用对象即可。(或者重新builder一个Response对象)

    public void pushOrder(RecordPushRequest pushRequest) throws Exception {
        //TODO:构造builder
        Request.Builder builder = new Request.Builder()
                .url(URL)
                .header("Content_Type", "application/json");
        //TODO:构造请求体
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
                objectMapper.writeValueAsString(pushRequest));
        //TODO:构造请求
        Request request = builder.post(requestBody).build();
        //TODO:发起请求
        Response response = httpClient.newCall(request).execute();
        String res = response.body().string();
//        logger.info(response.body().string()); //打印时重复使用了一次
        Map<String,Object> resMap=objectMapper.readValue(res,Map.class);
        logger.info("得到的响应解析结果:{} ",resMap);
    }

深扒response.body().string()问题原因

查看源码Response.class:

private final ResponseBody body;

发现body是一个ResponseBody 对象。继续查看ResponseBody 类的源码:

public abstract class ResponseBody implements Closeable 

ResponseBody类实现Closeable接口,感觉有点找到问题的源泉了,继续点进去看看Closeable接口是干嘛的:

public interface Closeable extends AutoCloseable {

    /**
     * Closes this stream and releases any system resources associated
     * with it. If the stream is already closed then invoking this
     * method has no effect.
     *
     * <p> As noted in {@link AutoCloseable#close()}, cases where the
     * close may fail require careful attention. It is strongly advised
     * to relinquish the underlying resources and to internally
     * <em>mark</em> the {@code Closeable} as closed, prior to throwing
     * the {@code IOException}.
     *
     * @throws IOException if an I/O error occurs
     */
    public void close() throws IOException;
}

Closeable接口继承AutoCloseable类,有一个close方法,官方标注:“关闭此流并释放与之关联的任何系统资源。

如果流已关闭,则调用此方法无效。”大概就是这个原因了。所以不要多次调用response.body().string();语句。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于IDEA关联数据库的问题

    关于IDEA关联数据库的问题

    这篇文章主要介绍了IDEA关联数据库的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java8 BigDecimal类型的List求和方式

    java8 BigDecimal类型的List求和方式

    这篇文章主要介绍了java8 BigDecimal类型的List求和方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-11-11
  • Hibernate悲观锁和乐观锁实例详解

    Hibernate悲观锁和乐观锁实例详解

    这篇文章主要介绍了Hibernate悲观锁和乐观锁实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java中文转全拼工具类分享

    java中文转全拼工具类分享

    这篇文章主要介绍了一个JAVA将汉字转换为全拼的工具类,大参考使用吧
    2014-01-01
  • java.lang.OutOfMemoryError 错误整理及解决办法

    java.lang.OutOfMemoryError 错误整理及解决办法

    这篇文章主要介绍了java.lang.OutOfMemoryError 错误整理及解决办法的相关资料,需要的朋友可以参考下
    2016-10-10
  • SpringBoot中API接口参数获取方式小结

    SpringBoot中API接口参数获取方式小结

    在Spring Boot中,API接口参数可以通过多种方式获取,具体取决于你定义的API接口参数类型(如路径参数、查询参数、请求体参数、请求头等),本文给大家就介绍了一些常见的参数获取方式,需要的朋友可以参考下
    2024-06-06
  • MyBatis批量查询、插入、更新、删除的实现示例

    MyBatis批量查询、插入、更新、删除的实现示例

    由于需要处理短时间内大量数据入库的问题,想到了Mybatis的批量操作,本文主要介绍了MyBatis批量查询、插入、更新、删除的实现示例,感兴趣的可以了解一下
    2023-05-05
  • 详解Java中自定义注解的使用

    详解Java中自定义注解的使用

    Annontation是Java5开始引入的新特征,中文名称叫注解,它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。本文主要介绍了自定义注解的使用,希望对大家有所帮助
    2023-03-03
  • 解决Mybatis查询方法selectById()主键不一致问题

    解决Mybatis查询方法selectById()主键不一致问题

    这篇文章主要介绍了解决Mybatis查询方法selectById()主键不一致问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • SpringMVC异常处理的三种方式小结

    SpringMVC异常处理的三种方式小结

    本文主要介绍了SpringMVC异常处理的三种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09

最新评论