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