Предупреждение об утечке ресурсов в затмении

В 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 закомментировано, предупреждение не будет отображаться.

Это понимание или проблема Java / Eclipse?

3 ответа

Если у вас есть это предупреждение, вы используете Java 7. В этом случае вам не следует закрывать ресурс, который реализует AutoClosable сам. Вы должны инициализировать эти ресурсы в специальном разделе инициализации try statementcommented:

// 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 рекомендует способ работы с автоматически закрываемыми ресурсами, который я описал выше, поэтому попробуйте это.

Я думаю, это проблема с чекером, который вы используете.

Разбейте свой код на initialization а также use блоки. Кроме того, выведите исключение из блока инициализации (или сделайте ранний возврат). Таким образом, нет необходимости проверять нулевое значение при освобождении ресурса после use блок

// 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());
    };
}

Измените имя переменной с c на mC. Я думаю, что это странный сбой при использовании c в качестве имени переменной. Спасибо чарли

Другие вопросы по тегам