最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決okhttp3提示java.lang.IllegalStateException:closed異常問題

 更新時(shí)間:2025年07月16日 08:42:46   作者:一縷純氧  
使用OkHttp3時(shí),response.body().string()只能調(diào)用一次,重復(fù)調(diào)用會(huì)導(dǎo)致流關(guān)閉異常,解決方法是保存響應(yīng)體內(nèi)容到變量或重新構(gòu)建Response對(duì)象,避免多次讀取

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

使用okhttp3的response.body().string()時(shí)候提示java.lang.IllegalStateException: closed異常

原因?yàn)閛khttp3請(qǐng)求回調(diào)中response.body().string()只能有效調(diào)用一次,而我使用了兩次,所以在第二次時(shí)調(diào)用時(shí)提示已關(guān)閉流的異常。

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

解決辦法

將返回的值保存在對(duì)象中,重復(fù)使用對(duì)象即可。(或者重新builder一個(gè)Response對(duì)象)

    public void pushOrder(RecordPushRequest pushRequest) throws Exception {
        //TODO:構(gòu)造builder
        Request.Builder builder = new Request.Builder()
                .url(URL)
                .header("Content_Type", "application/json");
        //TODO:構(gòu)造請(qǐng)求體
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
                objectMapper.writeValueAsString(pushRequest));
        //TODO:構(gòu)造請(qǐng)求
        Request request = builder.post(requestBody).build();
        //TODO:發(fā)起請(qǐng)求
        Response response = httpClient.newCall(request).execute();
        String res = response.body().string();
//        logger.info(response.body().string()); //打印時(shí)重復(fù)使用了一次
        Map<String,Object> resMap=objectMapper.readValue(res,Map.class);
        logger.info("得到的響應(yīng)解析結(jié)果:{} ",resMap);
    }

深扒response.body().string()問題原因

查看源碼Response.class:

private final ResponseBody body;

發(fā)現(xiàn)body是一個(gè)ResponseBody 對(duì)象。繼續(xù)查看ResponseBody 類的源碼:

public abstract class ResponseBody implements Closeable 

ResponseBody類實(shí)現(xiàn)Closeable接口,感覺有點(diǎn)找到問題的源泉了,繼續(xù)點(diǎn)進(jìn)去看看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類,有一個(gè)close方法,官方標(biāo)注:“關(guān)閉此流并釋放與之關(guān)聯(lián)的任何系統(tǒng)資源。

如果流已關(guān)閉,則調(diào)用此方法無效。”大概就是這個(gè)原因了。所以不要多次調(diào)用response.body().string();語句。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 配置了jdk的環(huán)境idea卻提示找不到j(luò)dk解決辦法

    配置了jdk的環(huán)境idea卻提示找不到j(luò)dk解決辦法

    在使用Java編程語言進(jìn)行開發(fā)時(shí),IDEA是一個(gè)非常流行和強(qiáng)大的集成開發(fā)環(huán)境,這篇文章主要給大家介紹了關(guān)于配置了jdk的環(huán)境idea卻提示找不到j(luò)dk的解決辦法,需要的朋友可以參考下
    2023-12-12
  • 服務(wù)性能優(yōu)化之mybatis-plus開啟與關(guān)閉SQL日志打印方法

    服務(wù)性能優(yōu)化之mybatis-plus開啟與關(guān)閉SQL日志打印方法

    這篇文章主要介紹了在Mybatis-plus中開啟和關(guān)閉控制臺(tái)SQL日志打印,在`application.properties`文件中,可以通過配置來實(shí)現(xiàn)SQL日志的開啟和關(guān)閉,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • 淺談SpringBoot @Autowired的兩種注入方式

    淺談SpringBoot @Autowired的兩種注入方式

    本文主要介紹了兩種SpringBoot @Autowired注入方式,具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Java泛型與注解全面分析講解

    Java泛型與注解全面分析講解

    Java?泛型(generics)是?Jdk?5?中引入的一個(gè)新特性,?泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時(shí)檢查。需要的可以參考一下
    2022-08-08
  • Java中ArrayList和LinkedList有什么區(qū)別舉例詳解

    Java中ArrayList和LinkedList有什么區(qū)別舉例詳解

    這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別的相關(guān)資料,包括數(shù)據(jù)結(jié)構(gòu)特性、核心操作性能、內(nèi)存與GC影響、擴(kuò)容機(jī)制、線程安全與并發(fā)方案,以及工程實(shí)踐場(chǎng)景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • Java中的ScheduledThreadPoolExecutor定時(shí)任務(wù)詳解

    Java中的ScheduledThreadPoolExecutor定時(shí)任務(wù)詳解

    這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來在給定的延遲之后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù),ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下
    2023-12-12
  • 使用IDEA創(chuàng)建java項(xiàng)目的步驟詳解(hello word)

    使用IDEA創(chuàng)建java項(xiàng)目的步驟詳解(hello word)

    這篇文章主要介紹了使用IDEA創(chuàng)建java項(xiàng)目的步驟詳解(hello word),本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java中的Semaphore信號(hào)量簡(jiǎn)單使用代碼實(shí)例

    Java中的Semaphore信號(hào)量簡(jiǎn)單使用代碼實(shí)例

    這篇文章主要介紹了Java中的Semaphore信號(hào)量簡(jiǎn)單使用代碼實(shí)例,Semaphore是用來保護(hù)一個(gè)或者多個(gè)共享資源的訪問,Semaphore內(nèi)部維護(hù)了一個(gè)計(jì)數(shù)器,其值為可以訪問的共享資源的個(gè)數(shù),一個(gè)線程要訪問共享資源,需要的朋友可以參考下
    2023-12-12
  • 簡(jiǎn)單講解Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法

    簡(jiǎn)單講解Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法

    這篇文章主要介紹了Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下
    2015-12-12
  • SpringBoot松散綁定/寬松綁定(Relaxed Binding)的實(shí)現(xiàn)

    SpringBoot松散綁定/寬松綁定(Relaxed Binding)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot松散綁定/寬松綁定(Relaxed Binding)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08

最新評(píng)論

孟州市| 临城县| 沙湾县| 韩城市| 东乡| 二连浩特市| 阜阳市| 团风县| 邵武市| 满洲里市| 沙坪坝区| 桦甸市| 崇信县| 南郑县| 子长县| 周口市| 疏勒县| 武冈市| 滨海县| 鹤庆县| 枞阳县| 汶川县| 灵石县| 新干县| 聂荣县| 寻乌县| 武隆县| 贡山| 淳安县| 元阳县| 蕉岭县| 庆阳市| 清水河县| 广饶县| 蒙山县| 介休市| 乌审旗| 上虞市| 锡林郭勒盟| 张家口市| 汪清县|