Предупреждение об утечке ресурсов в затмении
В 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 в качестве имени переменной. Спасибо чарли