Почему код в конечном итоге будет выполняться, даже если он вернулся в блок try? - PullRequest
3 голосов
/ 10 февраля 2011

Код: </p> <pre><code>public String get() { try { //doSomething return "Hello"; } finally { System.out.print("Finally"); }

Как этот код выполняется?

Ответы [ 3 ]

17 голосов
/ 10 февраля 2011

Поскольку в этом весь смысл блока finally - он выполняется, однако вы покидаете блок try, если только сама виртуальная машина не закрыта внезапно.

Как правило, блоки finally используются для очистки ресурсов - вы не хотите оставлять дескриптор файла открытым только потому, что вернулись во время блока try, не так ли? Теперь вы могли бы поместить этот код очистки непосредственно перед оператором return, но тогда он не будет очищен, если код вызовет исключение. При finally код очистки выполняется , однако вы покидаете блок, что, как правило, то, что вы хотите.

См. JLS раздел 14.20.2 для получения более подробной информации - и обратите внимание, как все пути включают выполнение блока finally.

3 голосов
/ 10 февраля 2011

Наконец ВСЕГДА выполняется независимо от того, что происходит в блоке try (ошибка, возврат, исключение, завершение и т. Д.).

Если вы неЕсли вы хотите, чтобы этот код выполнялся, вы всегда можете поместить его после оператора try / catch / finally.

0 голосов
/ 10 февраля 2011

Это именно то, для чего finally: код внутри будет выполняться, когда останется блок try, независимо от того, каким образом (кроме отключения JVM по System.exit() или по внешним причинам).

...