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()
很奇怪,但您无法控制它。
TA贡献1851条经验 获得超4个赞
该javadoc的展示了如何正确使用它:
try (ResponseBody responseBody = response.body()) {
... // Use the response.
}
这将自动为其添加一个 finally 子句。这可以正确处理读取和关闭流期间的异常。
编辑 2
经过更多研究后,它似乎正确关闭了资源(无泄漏)。
Eclipse 会报告警告,因为它不会检查该string()方法是否正确关闭了资源。事实上,eclipse 并没有遵循任何方法来检查这个警告(所以如果你编写了自己的 close 方法,你就会收到这个警告)。这意味着在这种情况下它会报告误报。
这样做可能是因为很难/不可能检查所有及时正确关闭资源的实现。
然而,将 try 与资源一起使用仍然是一个好习惯,因为这样您就不必担心底层代码如何处理内容。
添加回答
举报