解決okhttp3提示java.lang.IllegalStateException:closed異常問題
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解決辦法
在使用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日志打印方法
這篇文章主要介紹了在Mybatis-plus中開啟和關(guān)閉控制臺(tái)SQL日志打印,在`application.properties`文件中,可以通過配置來實(shí)現(xiàn)SQL日志的開啟和關(guān)閉,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
淺談SpringBoot @Autowired的兩種注入方式
本文主要介紹了兩種SpringBoot @Autowired注入方式,具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
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詳解,??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),本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
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)編程方法
這篇文章主要介紹了Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下2015-12-12
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

