← Назад к вопросам

Сработает ли код в finally, если в try написать return 1?

1.8 Middle🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Да, код в finally сработает

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

Как это работает

Вот пример:

public static int example() {
    try {
        System.out.println("In try block");
        return 1;
    } finally {
        System.out.println("In finally block");
    }
}

Вывод:

In try block
In finally block

Метод вернёт 1, но перед этим гарантированно выполнится код из блока finally.

Когда finally НЕ выполнится

Существуют редкие исключения:

  • System.exit() — если вызвать выход из JVM
  • Бесконечный цикл в try блоке
  • OutOfMemoryError или другие критические ошибки
  • Поток убит — если вызвать Thread.stop()
public static int exitExample() {
    try {
        System.exit(0);  // finally НЕ сработает
        return 1;
    } finally {
        System.out.println("This won't print");
    }
}

Практическое значение finally

Блок finally используется для:

  • Закрытия ресурсов (файлы, соединения, потоки)
  • Очистки состояния
  • Логирования
  • Гарантированного выполнения кода
public static void readFile() {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader("file.txt"));
        String line = reader.readLine();
        return line;
    } catch (IOException e) {
        System.err.println("Error: " + e.getMessage());
    } finally {
        // Это ВСЕГДА выполнится и закроет ресурс
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                System.err.println("Close error: " + e.getMessage());
            }
        }
    }
}

Современный подход: try-with-resources

В Java 7+ есть более удобный способ через try-with-resources, который автоматически закрывает ресурсы:

public static void readFile() {
    try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
        String line = reader.readLine();
        return line;
    } catch (IOException e) {
        System.err.println("Error: " + e.getMessage());
    }
    // Ресурс закроется автоматически
}

Этот подход эквивалентен явному finally блоку, но более читаемый.

Очередность выполнения

Порядок выполнения в конструкции try-catch-finally:

  1. Выполняется блок try
  2. При исключении — выполняется подходящий блок catch (если есть)
  3. Всегда выполняется блок finally
  4. Возвращается управление вызывающему коду

Это критично для надёжного кода, поэтому finally — один из столпов обработки ошибок в Java.

Сработает ли код в finally, если в try написать return 1? | PrepBro