猿问

潜在资源泄漏警告

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);

}


萧十郎
浏览 130回答 2
2回答

富国沪深

当您检查时response.body() != null,我相信您正在创建一个新的 流ResponseBody,即使在您行之后,该流仍保持打开状态String respBody = response.body().string()。因为您将此流保持打开状态,所以它会警告您潜在的资源泄漏。Pinkie Swirl 的回答应该可以解决您的问题,使用 try-with-resource 方法。至于您编辑以显示您尝试过的第二种方法,我推测它正在抛出警告,因为 Eclipse 无法看到.string()正在关闭对象的流ResponseBody body。但是,我也可以说它可能是警告,因为它可能仍在创建流,如果body为 null,则它永远不会关闭,因为.string()它永远不会被调用。在.close()处理完对象后显式调用没有坏处。无论如何,这样做可能是最佳实践,因为您有条件步骤。自动关闭流.string()很奇怪,但您无法控制它。

繁花不似锦

该javadoc的展示了如何正确使用它:try (ResponseBody responseBody = response.body()) {    ... // Use the response.}这将自动为其添加一个 finally 子句。这可以正确处理读取和关闭流期间的异常。编辑 2经过更多研究后,它似乎正确关闭了资源(无泄漏)。Eclipse 会报告警告,因为它不会检查该string()方法是否正确关闭了资源。事实上,eclipse 并没有遵循任何方法来检查这个警告(所以如果你编写了自己的 close 方法,你就会收到这个警告)。这意味着在这种情况下它会报告误报。这样做可能是因为很难/不可能检查所有及时正确关闭资源的实现。然而,将 try 与资源一起使用仍然是一个好习惯,因为这样您就不必担心底层代码如何处理内容。
随时随地看视频慕课网APP

相关分类

Java
我要回答