Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 潜在资源泄漏警告_Java - Fatal编程技术网

Java 潜在资源泄漏警告

Java 潜在资源泄漏警告,java,Java,Eclipse抱怨response.body()可能是潜在的资源泄漏。这里真的会有漏洞吗?文档中说response.body().string()将关闭资源 为了清楚起见,我理解如何解决警告(请尝试使用资源)。我只是想知道在什么情况下,资源会在这里泄漏?如果它不为null,则应该自动关闭它。如果它是空的,那么。。。那就没有什么可关闭的了 响应是:okhttp3。响应 try { if (response.body() != null) { String respBody

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

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

响应是: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);
}
显示了如何正确使用它:

try (ResponseBody responseBody = response.body()) {
    ... // Use the response.
}
这将自动向其中添加finally子句。这将在读取和关闭流期间正确处理异常

编辑2

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

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

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


不过,使用try with resource仍然是一种很好的做法,因为这样您就不必担心底层代码如何处理内容。

当您选中
response.body()!=null
,我相信您正在创建一个新的
响应库
,即使在您行了
String respBody=response.body().String()
之后,它仍然保持打开状态。由于您将此流保持打开状态,因此它会向您发出潜在资源泄漏的警告

小指漩涡的应该解决您的问题,使用与资源的尝试方法

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


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

什么是
响应
?什么是
响应
?它是否实现了
自动关闭
?您能否在本例中包括变量的类型?您需要发布一些上下文,以便人们了解什么是
响应
,更重要的是,您可以查看源代码,看看它在做什么。@BigBug:可能是IDE错误地显示警告时出现了问题。我知道如何修复警告。问题是,为什么它首先是一个警告——我实际上不知道我上面的代码中哪里会发生泄漏。谢谢你的回答。更新了我的答案。但是他没有关闭response.body()上的流,因为他在那里得到了警告。也许我不理解OP,这会导致我对此的误解,但是你的编辑2似乎仍然没有回答这个问题。在他调用
response.body()
的线路上,他收到了警告,但当他调用
response.body().string()
时,警告没有出现。我同意你的看法,他应该利用资源进行尝试,这应该能解决他的问题。但问题是,当他不使用try with resources时,为什么会在
response.body()
上得到警告。@pinkiewirl CodeMonkey是正确的。我在寻找“为什么”,而不是如何解决问题。此外,正如CodeMonkey所指出的,警告出现在response.body()上,而不是body.string()。。。