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