Как отмечали другие, ресурсы JDBC (операторы, наборы результатов и т. Д.) Редко бывают null
.Если это так, у вас на руках больше проблем, чем NullPointerException
s.В связи с этим NullPointerException
s поможет предупредить вас о серьезных проблемах с вашим драйвером JDBC.Типичная проверка null
перед вызовом close()
скрыла бы проблему, если бы ваш драйвер JDBC фактически предоставлял вам null
ссылки.
Кроме того, не все драйверы JDBC следуют спецификацииточно.Например, некоторые драйверы не будут автоматически закрывать ResultSet
, когда связанный Statement
закрыт.Поэтому вы должны убедиться, что вы явно закроете оба ResultSet
и его Statement
(вздох).
На практике я нашел этот приемполезный (хотя и не самый красивый):
PreparedStatement statement = connection.prepareStatement("...");
try {
ResultSet results = statement.executeQuery();
try {
while (results.next()) {
// ...
}
} finally {
results.close();
}
} finally {
statement.close();
}
Этот метод гарантирует выполнение каждого оператора close()
, начиная с ResultSet
и продолжая свой путь наружу.NullPointerException
s все еще выбрасываются, если драйвер предоставит вам null
ссылки, но я допускаю это по причинам, объясненным в начале.SQLException
все еще выбрасываются, если какое-либо из операторов close()
не выполняется (я считаю, что это хорошо - я хочу знать, если что-то идет не так).