Eclipse中的资源泄漏问题?

Eclipse中的资源泄漏问题?,eclipse,java-7,resource-leak,Eclipse,Java 7,Resource Leak,我做了一些测试(使用Windows7、EclipseJuno4.2.1和Java7SE),发现如果一个方法没有在catch块中显式返回,并且如果该对象在try/catch之外声明,则不会发出“资源泄漏”警告 不会生成“资源泄漏”: 代码中的微小更改会产生“资源泄漏”: 所有的方法在功能上似乎都是相同的——那么解释是什么呢?如果这是一个bug,这是Eclipse还是Java问题?经过一些研究,我得出结论,这是一个Eclipse bug。我在Eclipse下载站点(开普勒M3)上找到的最新版本中对其

我做了一些测试(使用Windows7、EclipseJuno4.2.1和Java7SE),发现如果一个方法没有在catch块中显式返回,并且如果该对象在try/catch之外声明,则不会发出“资源泄漏”警告

不会生成“资源泄漏”:

代码中的微小更改会产生“资源泄漏”:


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

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

    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) {
}
public void makeConnection()引发SQLException{
连接=空;
试一试{
connection=DriverManager.getConnection(“localhost”);
对于(int i=0;i<1;i++)
if(i<1)
抛出新的SQLException(“Foo”);
commit();
}最后{
关闭(连接);
}
}
公共空间关闭(连接c){
}
此代码将生成资源泄漏警告。但是,通过移除其中一个

  • 呼叫关闭(连接)
  • for循环
…资源泄漏警告将消失。奇怪的是,在普通情况下不会报告资源泄漏,您只需创建一个连接而不关闭它

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

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

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