getConnection
должен выдать исключение вместо возврата null
. Возвращать null
нехорошо . SonarCloud seems to be wanting you to put a try-with-resource opening in
getPreparedStatement (must include the
setString`) и закрывать в вызывающем методе, что, конечно, вы не можете сделать так.
Наилучший подход - это Выполнить Вокруг идиома . Вместо getPreparedStatement
возвращает PreparedStatement
проход в лямбда-выражении (обычно) для выполнения. Затем ресурс может быть чисто закрыт в операторе try-with-resource.
/*** NICE ***/
// Function instead of Consumer would allow the method to return a value.
private void prepared(
Connection connection, Consumer<PreparedStatement> op
) throws SQLException {
// Might want to add getConnection in here too, perhaps.
try (
PreparedStatement statement =
connection.prepareStatement(SQL)
) {
statement.setString(1, "someString");
op.accept(statement);
}
}
Используется как:
try (Connection connection = getConnection()) {
prepared(connection, statement -> {
// blah, blah, blah
});
}
Хакерская альтернатива - включить оператор try в getPreparedStatement
это только закрыто в условиях ошибки.
/*** HACKY ***/
private PreparedStatement prepared(
Connection connection
) throws SQLException {
boolean success = false;
PreparedStatement statement =
connection.prepareStatement(SQL);
try {
statement.setString(1, "someString");
success = true;
return preparedStatement;
} finally {
if (!success) {
statement.close();
}
}
}
Если вы отчаянно хотите, чтобы getConnection
возвратил null
(не) и использовал одну попытку записи с ресурсом из двух записей, тогда условный оператор работает.
try (
Connection connection = getConnection();
PreparedStatement statement =
connection==null ? null : connection.prepareStatement(SQL)
) {