Когда нужно использовать блок finally в Java?

«Когда нужно использовать блок finally в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Блок finally используется в конструкции try-catch для выполнения кода, который должен быть выполнен в любом случае, независимо от того, было ли выброшено исключение в блоке try или нет. Это критически важно для освобождения ресурсов и предотвращения утечек.

Типичные сценарии использования:

  1. Закрытие ресурсов: Файловые потоки, сетевые соединения, соединения с базой данных.
  2. Освобождение системных блокировок.
  3. Логирование завершения операции (успешного или неудачного).

Пример с блоком 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 блоке