4

我正在使用启用了资源泄漏警告的 Eclipse 4.2。

在我看来,此代码会产生错误的资源泄漏警告。

    public static void test(){
    InputStream in = null;
try {
    in = new FileInputStream("A");
} catch (IOException e) {
    return;
}finally{
    close(in);
}
}

public static void close(Closeable closeable) {
if (closeable != null) {
    try {
        closeable.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

如果我重构代码,并将 close 方法拉到 finally 块中,一切都很好。

    public static void test2(){
    InputStream in = null;
try {
    in = new FileInputStream("A");
} catch (IOException e) {
    return;
}finally{
    if (in != null) {
        try {
            in.close();
        } catch (IOException e) {
        e.printStackTrace()
        }
    }
}
}

我可以以某种方式删除这些警告而不必复制close方法的代码并且不必禁用资源泄漏警告吗?

我在这里找到了一个错误报告,说明循环中发生了类似的事情,但我的代码中不存在循环。

4

2 回答 2

3
  • 您应该看到“潜在的资源泄漏...”警告,如果没有,请打开一个错误。
  • 这里的主要问题是编译器不知道 'close(..)' 方法的作用。它可能会也可能不会关闭资源。(注意编译器不进行过程间分析)
  • 您可以选择忽略“潜在资源泄漏”警告。(“资源泄漏”警告保证是正确的,但“潜在...”警告不是)

可以在此处找到有关资源泄漏分析的更多详细信息 - http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-avoiding_resource_leaks.htm&cp=1_3_9_1

编辑:关于“资源泄漏”与“潜在资源泄漏”的一句话

  • 这个想法是保证所有报告的“资源泄漏”警告都是正确的,但可能不是代码库中的“所有”资源泄漏。
  • “潜在的资源泄漏”是……潜在的问题。一些开发人员在知道出现问题但不知道在哪里时会打开“潜在...”警告。在这种情况下,潜在的警告有助于缩小搜索范围。其他一些开发人员只是不时检查潜在的警告,看看那里是否存在真正的问题。

理想情况下,我们希望编译器为我们提供完整且正确的问题集,但实现这一点存在局限性:-)

于 2012-07-02T11:44:21.143 回答
1

好消息:Eclipse 4.3 将识别 Google 和 Apache 关闭实用程序!

http://download.eclipse.org/eclipse/downloads/drops4/S-4.3M4-201212140730/news/

(搜索“泄漏分析”)

于 2013-03-01T21:04:54.767 回答