Eclipse中的资源泄漏问题?

mor*_*nsi 5 eclipse resource-leak java-7

我做了一些测试(使用Windows 7,Eclipse Juno 4.2.1和Java 7 SE),发现如果一个方法没有在catch-block中显式返回,并且如果对象是在try/catch之外声明的,则没有"资源"泄漏"警告已发出警告.

不会产生"资源泄漏":

    public void extISImReturnNoWarning() {
    InputStream is = null;
    try {
        is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
    }
}
Run Code Online (Sandbox Code Playgroud)

代码中的小变化会导致"资源泄漏":

public void locISImReturnHasWarning() {
    try {
        InputStream is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
    }
}

public void extISExReturnHasWarning() {
    InputStream is = null;
    try {
        is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有方法看起来功能相同 - 那么解释是什么呢?如果这是一个错误,这是Eclipse还是Java问题?

mor*_*nsi 2

经过一些研究,我得出的结论是这是一个 Eclipse 错误。我已经在 Eclipse 下载站点 (Kepler M3) 上找到的最新版本中对其进行了测试,但问题仍然存在。我还发现 Eclipse 项目中过去 30 天报告的类似问题有 5-6 个错误报告。在研究过程中我还发现了另一个奇怪的行为:

    public void makeConnection() throws SQLException {
    Connection connection = null;
    try {
        connection = DriverManager.getConnection("localhost");
        for (int i = 0; i < 1; i++)
            if (i < 1)
                throw new SQLException("Foo");
        connection.commit();
    } finally {
        close(connection);
    }
}

public void close(Connection c) {
}
Run Code Online (Sandbox Code Playgroud)

此代码将生成资源泄漏警告。然而,通过删除其中之一

  • 调用关闭(连接)
  • for循环

..资源泄漏警告将消失。奇怪的是 - 在普通情况下不会报告资源泄漏,您只需创建一个连接而不关闭它。

总而言之,我认为 Eclipse Juno 中的资源泄漏检测目前可能有点容易出现错误。也许现在最好忽略 Eclipse 中的资源泄漏,并等待 Kepler。

2014 年 12 月更新:当前正在运行 Eclipse Luna,问题仍然存在...