java - 潜在资源泄漏警告
问题描述
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);
}
解决方案
javadoc展示了如何正确使用它:
try (ResponseBody responseBody = response.body()) {
... // Use the response.
}
这将自动为其添加一个 finally 子句。这可以在读取和关闭流期间正确处理异常。
编辑 2
在做了更多研究之后,它似乎正确关闭了资源(没有泄漏)。
Eclipse 报告一个警告,因为它不检查该string()
方法是否正确关闭了资源。事实上,eclipse 没有遵循任何方法来检查这个警告(所以如果你编写了自己的 close 方法,你会得到这个警告)。这意味着它在这种情况下报告了误报。
这样做可能是因为很难/不可能检查所有及时正确关闭资源的实现。
但是,将 try 与资源一起使用仍然是一种好习惯,因为这样您就不必担心底层代码如何处理内容。
推荐阅读
- javascript - 谷歌 oauth2.0 显示无效客户端错误
- google-api - Google oAuth API:如何为未经身份验证的用户显示谷歌登录层?
- php - 使用 codeigniter 的 dompdf 库不起作用 html 和 css
- java - 如何在java中捕获没有数据的堆转储
- java - 如何解压缩包含多个文件的 .gz 文件
- java - 获取数据集并将其打印到二维数组中
- python - 如何将所有单词与正则表达式匹配,除了 urls 或类似的?
- python - NLTK 词汇色散图未在 Google Colab 上显示
- ios - 让 invokeUndefinedMethodFromWebScript 在 Swift 中工作
- c++ - c++ 两个具有相互指向的 const 指针的对象