Ответ
Блок finally используется в конструкции try-catch для выполнения кода, который должен быть выполнен в любом случае, независимо от того, было ли выброшено исключение в блоке try или нет. Это критически важно для освобождения ресурсов и предотвращения утечек.
Типичные сценарии использования:
- Закрытие ресурсов: Файловые потоки, сетевые соединения, соединения с базой данных.
- Освобождение системных блокировок.
- Логирование завершения операции (успешного или неудачного).
Пример с блоком finally:
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
// Выполнение SQL-запроса
stmt.executeUpdate(query);
} catch (SQLException e) {
// Обработка ошибки БД
e.printStackTrace();
} finally {
// Этот код выполнится всегда
try {
if (stmt != null) stmt.close();
} catch (SQLException se) { /* логируем, но не прерываем */ }
try {
if (conn != null) conn.close();
} catch (SQLException se) { /* логируем */ }
}
Современная альтернатива (Java 7+): try-with-resources
Этот синтаксис автоматически закрывает все ресурсы, реализующие интерфейс AutoCloseable, делая код чище и безопаснее.
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement()) {
// Выполнение SQL-запроса
stmt.executeUpdate(query);
} catch (SQLException e) {
// Обработка ошибки БД
e.printStackTrace();
}
// Ресурсы conn и stmt будут закрыты автоматически здесь, в неявном finally блоке