← Назад к вопросам
Сработает ли код в 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:
- Выполняется блок try
- При исключении — выполняется подходящий блок catch (если есть)
- Всегда выполняется блок finally
- Возвращается управление вызывающему коду
Это критично для надёжного кода, поэтому finally — один из столпов обработки ошибок в Java.