首页 > 解决方案 > 潜在资源泄漏警告

问题描述

Eclipse 抱怨 response.body() 可能是潜在的资源泄漏。这里真的会有泄漏吗?文档说 response.body().string() 将关闭资源。

为了清楚起见,我了解尝试使用资源)如何解决警告。我只是想知道在什么情况下资源实际上会在这里泄漏?如果它不为空,它应该会自动关闭。如果它为空,那么......那么没有什么可以关闭......?

响应是:okhttp3.Response

try {
    if (response.body() != null) {
        String respBody = response.body().string();
    }
} catch (IOException e) {
    throw new ApiException(e);
}

根据其中一个答案,我尝试执行以下操作并得到相同的警告:

try {
    ResponseBody body = response.body()
    if (body != null) {
        String respBody = body.string();
    }
} catch (IOException e) {
    throw new ApiException(e);
}

标签: java

解决方案


javadoc展示了如何正确使用它:

try (ResponseBody responseBody = response.body()) {
    ... // Use the response.
}

这将自动为其添加一个 finally 子句。这可以在读取和关闭流期间正确处理异常。

编辑 2

在做了更多研究之后,它似乎正确关闭了资源(没有泄漏)。

Eclipse 报告一个警告,因为它不检查该string()方法是否正确关闭了资源。事实上,eclipse 没有遵循任何方法来检查这个警告(所以如果你编写了自己的 close 方法,你会得到这个警告)。这意味着它在这种情况下报告了误报。

这样做可能是因为很难/不可能检查所有及时正确关闭资源的实现。

但是,将 try 与资源一起使用仍然是一种好习惯,因为这样您就不必担心底层代码如何处理内容。


推荐阅读