IllegalStateException:响应不符合正文的条件,并且不得关闭



有时我们会得到这个异常处理响应。看来Response有一个null主体。

代码类似于:

try (Response response = client.newCall(request).execute()) {
// do stuff with the response
} catch (Exception e) {
log.error("Something wrong", e);
}

在执行do stuff with response块之后,在Response上自动调用的close()方法上引发异常。

堆栈跟踪:

java.lang.IllegalStateException: response is not eligible for a body and must not be closed
at okhttp3.Response.close(Response.java:281)

我们是不是错过了什么
谢谢。

我认为u可以调用与response.close()相同的response.body.close(),并且在关闭之前检查body是否为null。

ResponseBody responseBody = null;
try {
Response response = client.newCall(request).execute();
responseBody = response.body();
// do stuff with the response
} catch (Exception e) {
log.error("Something wrong", e);
} finally {
if (responseBody != null) {
responseBody.close();
}
}

由于Try with Resources与Auto closable一起工作(即类实现了closable接口,它尝试在块之后自动调用close。

现在,Response close((方法的规范确实指定了该方法在某些情况下会抛出和异常。

关闭不符合正文条件的响应是错误的。这包括从{@link#cacheResponse}返回的响应,{@link#networkResponse}和{@link priorionResponse((}。

来源:https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/Response.java

因此,这是"预期的",您可以只记录详细信息,并在预期的情况下继续。或者,如果不是预期的,则进行适当的处理(例如:重试(。。

最新更新