eclipse - Eclipse 中的资源泄漏问题?

标签 eclipse java-7 resource-leak

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

不会产生“资源泄漏”:

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

代码中的小改动会产生“资源泄漏”:
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;
    }
}

所有方法在功能上似乎都相同 - 那么解释是什么?如果这是一个错误,这是 Eclipse 还是 Java 问题?

最佳答案

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

    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) {
}

此代码将生成资源泄漏警告。但是,通过删除其中之一
  • 关闭(连接)的调用
  • for 循环

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

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

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

    关于eclipse - Eclipse 中的资源泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13701704/

    相关文章:

    javascript - Tomcat Websocket代码在localhost上成功,但是在为远程主机托管和修改时失败

    eclipse - hibernate + PostgreSQL : relation does not exist - SQL Error: 0, SQLState:42P01

    winapi - 我可能会泄露哪些未命名的 GDI 资源

    java - Guava 上的 ClassNotFoundException

    java - eclipse "Error: Could not find or load main class"

    macos - 是否可以在生产中获取并运行 JDK 7?

    java - 如何查看java源代码的修订历史

    Java:使用库将文件从 URL 直接上传到 FTP 服务器

    java - 文件处理的资源泄漏,try with resources VS try-catch-finally with file.close()

    java - 如果未正确完成 RestEasyClient JAX RS 可能会出现资源泄漏