Для чего нужно ключевое слово finally в Java?

Ответ

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

Пример:

try {
    // Код, который может вызвать исключение
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("Деление на ноль!");
} finally {
    System.out.println("Этот блок выполнится всегда.");
}

Зачем нужно?

  • Освобождение ресурсов: Гарантированное закрытие файлов, соединений с БД, сетевых сокетов.
  • Гарантированное выполнение критически важного кода: Логирование, завершение транзакций, сброс флагов.

Даже если в try или catch есть return, continue или break, блок finally выполнится перед выходом из метода или цикла.

Ответ 18+ 🔞

Давай разберёмся, что это за зверь такой — finally. Представь, ты пошёл в магазин за пивом. Это твой try-блок.

try {
    // Иду за пивом
    goToShopForBeer();
}

Но по дороге тебя может огреть исключение — например, встретится бывшая и устроит сцену. Это catch.

catch (ExGirlfriendException e) {
    System.out.println("Всё пропало, идём домой без пива и в депрессии.");
}

И вот тут вступает наш герой — finally. Это как твой внутренний долг, который ты обязан выполнить, даже если всё пошло по пизде. Например, вынести мусор, который ты обещал ещё утром.

finally {
    System.out.println("Выношу мусор. Потому что надо. Всегда.");
}

Суть в чём? Код в finally выполнится при любом раскладе. Пиво купил — вынес мусор. Бывшая наорала — всё равно вынес мусор, сквозь слёзы. Даже если ты в блоке try такой: "Всё, я возвращаюсь домой (return)" — тебя всё равно сначала заставят мусор вынести, а уж потом отпустят. Жёстко, но справедливо.

Где это реально нужно? Ну, ёпта, везде, где ты что-то открыл или занял. Файл, соединение с базой, сокет — это всё ресурсы, которые жрут память. Их надо закрывать, даже если посередине работы всё накрылось медным тазом.

Connection conn = null;
try {
    conn = openDatabaseConnection(); // Открыли
    doSomeCriticalShit(conn); // Работаем
} catch (SQLException e) {
    System.out.println("Всё сломалось, охуенно!");
} finally {
    // А вот это — святое. Закрываем, даже если выше всё упало.
    if (conn != null) {
        conn.close(); // Сказали "закрой" — закрой, распиздяй!
    }
}

Если этого не сделать, будут утечки, сервер упадёт, админ прийдёт с вилкой... короче, finally — это твой страховочный ремень от самого себя. Ставь всегда, когда есть что чистить. Волнение ебать, но без него никуда.