Ответ
Нет, не во всех случаях. Хотя блок finally предназначен для гарантированного выполнения кода очистки после try (и catch), есть ситуации, когда он не будет выполнен:
- Принудительное завершение JVM:
System.exit(int status). - Сбой виртуальной машины: Например, фатальная ошибка нативным кодом (
OutOfMemoryErrorможет, но не всегда, предотвратить выполнениеfinally). - Принудительное завершение потока: Устаревшие методы
Thread.stop()илиThread.destroy(). - Бесконечный цикл или deadlock внутри блока
tryилиcatch. - Сбой операционной системы (например, "kill -9" на Unix).
Пример, когда finally выполнится:
try {
System.out.println("В try");
throw new RuntimeException("Исключение!");
} catch (RuntimeException e) {
System.out.println("В catch: " + e.getMessage());
// Можно сгенерировать новое исключение, finally все равно выполнится
throw new IllegalArgumentException("Новое исключение из catch");
} finally {
// Этот блок выполнится ВСЕГДА, даже если catch повторно выбросил исключение.
System.out.println("В finally (гарантированно, если JVM жива)");
}
Вывод программы:
В try
В catch: Исключение!
В finally (гарантированно, если JVM жива)
Exception in thread "main" java.lang.IllegalArgumentException: Новое исключение из catch