代码之家  ›  专栏  ›  技术社区  ›  BigBug

潜在资源泄漏警告

  •  -2
  • BigBug  · 技术社区  · 6 年前

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

    只是说清楚,我明白 (尝试使用资源)以解决警告。我只是想知道在什么情况下资源会被泄露?如果不为空,则应自动关闭。如果它是空的,那么。。。那就没什么可关闭的了?

    答复是: okhttp3.响应

    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);
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   CodeMonkey    6 年前

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

    小漩涡 answer 应该使用try with resource方法解决您的问题。

    至于您的编辑显示您尝试的第二种方法,我猜测它会抛出警告,因为Eclipse无法看到 .string() 正在关闭对象的流 ResponseBody body . 但是,我也可以说它可能是警告,因为它可能仍然在创建流,并且如果 body 为空,则它永远不会关闭,因为 .string() 从来没人打过电话。

    打电话没有坏处 .close() 在处理完对象之后显式地。这可能是最好的做法,无论如何,因为你有条件步骤。自动关闭流 .string() 很奇怪,但你无法控制。

        2
  •  2
  •   Pinkie Swirl    6 年前

    这个 javadoc 演示如何正确使用它:

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

    这将自动向它添加finally子句。这可以在读取期间正确处理异常 关闭流。

    编辑2

    Eclipse报告一个警告,因为它不检查 string() 方法正确关闭资源。事实上,eclipse不遵循任何方法来检查此警告(因此,如果您编写自己的close方法,您将收到此警告)。这意味着在这种情况下它会报告假阳性。

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

    不过,使用try with resource仍然是一个很好的实践,因为这样您就不必担心底层代码如何处理东西了。