Предположим, что следующая функция:
public void close() throws SQLException {
if (rs != null) { rs.close(); }
if (ps != null) { ps.close(); }
if (connection != null){ connection.close(); }
}
Если я попытаюсь закрыть rs, и он терпит неудачу, остальная часть моего кода все равно будет выполнена (т.е. Исключение будет выбрано в конце), или оно немедленно прерывает функцию (и, таким образом, предотвращает правильное закрытие ps и соединения),
Если исключение происходит в rs.close
, то исключение rs.close
. Если вы хотите, чтобы эти другие операторы выполнялись, вам нужно finally
использовать. Если вы подозреваете, что будет closeQuietly
другое исключение, вы можете создать такую функцию, как closeQuietly
которая будет признавать, но отказаться от исключений, если вы считаете, что их можно безопасно игнорировать. Например (из этого ответа),
protected void closeQuietly( Resource resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during Resource.close()", ex );
}
}
Когда rs.close()
выдает исключение, остальные строки не будут выполнены. Пойманное исключение будет распространяться.
Если вы хотите, чтобы другой оператор не прерывал работу с другими, используйте отдельный блок try/catch для каждого закрытия.
Вы можете создать метод утилиты для закрытия ресурсов, а затем вызвать этот метод с помощью ресурсов. Поскольку AutoCloseable
является супер интерфейсом Connection
, Statement
, ResultSet
, вы можете определить метод утилиты, как AutoCloseable
ниже
public static void closeQuietly(AutoCloseable resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during closing the resources", ex );
}
}
Это то, на что предназначена новая функция Java 7 try-with-resources !
Вы просто используете его таким образом:
try (
final Type1 rs = ...;
final Type2 ps = ...;
final Connection connection = ...
) {
...
... // usefull code here
...
}
catch (...) {
// exception handling
}
и автоматически все закрывается в любом случае (если ваш полезный код генерирует исключение или если он не бросается), все исключения обрабатываются, и вы оставляете блок в согласованном состоянии. Единственное, что все классы (Type1
, Type2
, Connection
) должны реализовывать интерфейс Autocloseable
.
вам нужно поместить строки, которые вы хотите выполнить в последнем объявлении, оператор finally сделает то, что вы хотите, прежде чем выбросить исключение. Вы также можете проверить autocloseable интерфейс
Если первая команда вызывает исключение, остальная часть программы больше не выполняется. Чтобы решить эту проблему, finally
-block был введен для обработки исключений. Там вы можете освободить любые ресурсы.
finally
.