18

Eclipse我收到一个Resource leak: 'ps' is not closed at this location我不明白的警告。

在我的Java代码中,我将“ps”声明为准备好的语句,并多次使用(并关闭)它。然后我有以下顺序:

try {
    if(condition) {
        ps = c.prepareStatement("UPDATE 1 ...");
    } else {
        ps = c.prepareStatement("UPDATE 2 ...");
    }
    ps.executeUpdate();
} catch (SQLException e) {
    // exception handling
} finally {
    if (null != ps) 
        try { 
            ps.close(); 
        } catch (SQLException e) { 
            // exception handling
        };
}

“资源泄漏”-警告出现在 else 部分的“更新”-语句中。如果我ps = null在开始尝试块之前设置,则没有警告。

如果第二个 UPDATE-Statement 被注释掉,则不会显示警告。

这是理解还是 java / eclipse 问题?

4

3 回答 3

11

如果您收到此警告,则说明您使用的是 Java 7。在这种情况下,您不应关闭AutoClosable自己实现的资源。您应该在声明注释的特殊初始化部分初始化这些资源try

// decide which update statement you need:
// (your if should be here)
String update = ....;
try (
     ps = c.prepareStatement(update);
) {
   // use prepared statement here.
} catch (SQLException) {
   // log your exception
   throw new RuntimeException(e);
}
// no finally block is needed. The resource will be closed automatically.

我确实不知道为什么if/else声明的存在会导致警告出现或消失。但是 java 7 推荐使用我上面描述的自动关闭资源的方法,所以试试这个。

于 2013-02-13T21:08:00.573 回答
3

我认为,这是您使用的检查器的问题。

将您的代码分成initializationuse块。此外,从初始化块中抛出异常(或提前返回)。use这样在块后释放资源时就不需要检查null

// initialization
// Note that ps is declared final.
// I think it will help to silence your checker
final PreparedStatement ps;

try {
    if( bedingungen ... ) {
        ps = c.prepareStatement("UPDATE 1 ...");
    } else {
        ps = c.prepareStatement("UPDATE 2 ...");
    }
} 
catch (SQLException e) {
    log.error("Problem creating prepared statement, e );
    throw e;
}

// use
try {
    ps.executeUpdate();
} catch (SQLException e) {
    log.error("Problem decrementing palets on " + srcElement.getName() + 
        ": " +    e.getMessage());
}
finally {
    try {
        ps.close();
    } catch (SQLException e) {
        log.warn("Error closing PreparedStatement: " + e.getMessage());
    };
}
于 2013-02-13T20:58:35.317 回答
-5

将变量名从 c 更改为 mC。我认为使用 c 作为变量名时这是一个奇怪的故障。谢谢查理

于 2014-12-16T16:28:46.003 回答