Ответ
Да, блок 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, так как это "затирает" исключения и возвращаемые значения из основного потока, что затрудняет отладку.