为了账号安全,请及时绑定邮箱和手机立即绑定

潜在资源泄漏警告

潜在资源泄漏警告

萧十郎 2021-08-04 16:39:56
Eclipse 抱怨 response.body() 可能是潜在的资源泄漏。这里真的会漏水吗?文档说 response.body().string() 将关闭资源。为了清楚起见,我了解如何(尝试使用资源)解决警告。我只是想知道在什么情况下资源会真正泄漏到这里?如果它不为空,它应该会自动关闭。如果它为空,那么......那么没有什么可以关闭......?响应是:okhttp3.Responsetry {    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);}
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

当您检查时response.body() != null,我相信您正在创建一个新的 流ResponseBody,即使在您行之后,该流仍保持打开状态String respBody = response.body().string()。因为您将此流保持打开状态,所以它会警告您潜在的资源泄漏。

Pinkie Swirl 的回答应该可以解决您的问题,使用 try-with-resource 方法。

至于您编辑以显示您尝试过的第二种方法,我推测它正在抛出警告,因为 Eclipse 无法看到.string()正在关闭对象的流ResponseBody body。但是,我也可以说它可能是警告,因为它可能仍在创建流,如果body为 null,则它永远不会关闭,因为.string()它永远不会被调用。

.close()处理完对象后显式调用没有坏处。无论如何,这样做可能是最佳实践,因为您有条件步骤。自动关闭流.string()很奇怪,但您无法控制它。


查看完整回答
反对 回复 2021-08-04
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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


try (ResponseBody responseBody = response.body()) {

    ... // Use the response.

}

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


编辑 2


经过更多研究后,它似乎正确关闭了资源(无泄漏)。


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


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


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


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信