НЕ ВСЕГДА
Спецификация языка Java описывает, как блоки try-catch-finally и try-catch работают на 14.20.2
Ни в каком месте это не указывает, что блок finally всегда выполняется.
Но для всех случаев, когда блоки try-catch-finally и try-finally завершаются, он указывает, что перед выполнением, наконец, должен быть выполнен finally.
try {
CODE inside the try block
}
finally {
FIN code inside finally block
}
NEXT code executed after the try-finally block (may be in a different method).
JLS не гарантирует, что FIN будет выполнено после CODE .
JLS гарантирует, что если CODE и NEXT будут выполнены, то FIN всегда будет выполняться после CODE и до NEXT .
Почему JLS не гарантирует, что блок finally всегда выполняется после блока try? Потому что это невозможно. Маловероятно, но возможно, что JVM будет прервана (kill, crash, power off) сразу после завершения блока try, но перед выполнением блока finally. JLS ничего не может сделать, чтобы этого избежать.
Таким образом, любое программное обеспечение, для которого его правильное поведение зависит от блоков finally, всегда выполняющихся после завершения их блоков try.
Возвращения в блоке try не имеют отношения к этой проблеме. Если выполнение достигает кода после try-catch-finally, гарантируется, что блок finally будет выполнен до, с возвратом или без него внутри блока try.