Ответ
Блок finally используется в конструкции try-catch для выполнения кода, который должен быть выполнен всегда, независимо от того:
- Выполнился ли блок
tryбез исключений. - Было ли выброшено и обработано исключение в
catch. - Было ли выброшено необработанное исключение.
- Был ли использован
return,breakилиcontinueвнутриtryилиcatch.
Основное назначение — освобождение ресурсов (закрытие файлов, сетевых соединений и т.д.).
Пример (Java до версии 7):
FileInputStream fis = null;
try {
fis = new FileInputStream("data.txt");
// Чтение файла, возможна IOException
} catch (IOException e) {
System.err.println("Ошибка чтения: " + e.getMessage());
} finally {
// Этот код выполнится в любом случае
if (fis != null) {
try {
fis.close(); // Гарантированная попытка закрыть ресурс
} catch (IOException e) {
System.err.println("Ошибка при закрытии файла");
}
}
}
Современная альтернатива (Java 7+): try-with-resources
Автоматически закрывает ресурсы, реализующие интерфейс AutoCloseable.
try (FileInputStream fis = new FileInputStream("data.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
// Работа с ресурсами
} catch (IOException e) {
// Обработка исключения
} // Ресурсы закрываются автоматически, блок finally не нужен
Блок finally остаётся полезным для любой другой «финализирующей» логики, не связанной с AutoCloseable.