Да, блоки finally всегда запускаются ... кроме случаев, когда:
- Поток, выполняющий блок try-catch-finally, уничтожен или прерван
- Вы используете
System.exit(0);
- Основная виртуальная машина уничтожена другим способом
- Базовое оборудование каким-то образом непригодно для использования
Кроме того, если метод в вашем блоке finally генерирует неперехваченное исключение, то после этого ничего не будет выполнено (т. Е. Исключение будет сгенерировано, как в любом другом коде). Очень распространенный случай, когда это происходит, java.sql.Connection.close()
.
Кроме того, я предполагаю, что пример кода, который вы использовали, является лишь примером, но будьте осторожны, помещая действительную логику в блок finally. Блок finally предназначен для очистки ресурсов (закрытие соединений с БД, освобождение файловых дескрипторов и т. Д.), А не для обязательной логики. Если он должен выполнить, сделайте это перед блоком try-catch, вдали от чего-то, что может вызвать исключение, поскольку ваше намерение почти наверняка функционально одинаково.