Выполнится ли блок finally, если в блоке try вызван оператор return?

«Выполнится ли блок finally, если в блоке try вызван оператор return?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, блок finally выполнится обязательно. Управление передаётся в finally перед фактическим возвратом значения из метода.

Пример, демонстрирующий порядок выполнения:

public class FinallyReturnExample {
    public static int test() {
        try {
            System.out.println("Inside try");
            return 1; // 1. Значение '1' вычислено и подготовлено к возврату
        } finally {
            System.out.println("Inside finally"); // 2. Блок finally выполняется
        }
        // 3. Метод возвращает ранее вычисленное значение '1'
    }

    public static void main(String[] args) {
        System.out.println("Result: " + test());
    }
}
// Вывод:
// Inside try
// Inside finally
// Result: 1

Критически важное исключение: Если внутри блока finally также есть свой return, он переопределит возвращаемое значение из блока try или catch.

public static int overrideExample() {
    try {
        return 1;
    } finally {
        return 2; // Это значение будет возвращено!
    }
}
// Метод вернёт 2, а не 1.

Практический совет: Избегайте return в блоке finally, так как это "затирает" исключения и возвращаемые значения из основного потока, что затрудняет отладку.