Код: Почему код, в конце концов, будет выполнен, даже если он вернулся в блок try?
public String get() {
try {
//doSomething
return "Hello";
}
finally {
System.out.print("Finally");
}
Как выполняется этот код?
Код: Почему код, в конце концов, будет выполнен, даже если он вернулся в блок try?
public String get() {
try {
//doSomething
return "Hello";
}
finally {
System.out.print("Finally");
}
Как выполняется этот код?
Потому что это целая точка в блоке finally
- она выполняется, однако вы оставляете блок try
, если только сама ВМ не отключена.
Как правило, finally
блоки используются для очистки ресурсов - вы не захотите оставить дескриптор файла открытым только потому, что вы вернулись во время блока try
, не так ли? Теперь вы могли бы поставить этот код очистки непосредственно перед оператором return, но тогда он не будет очищен, если вместо этого вместо кода будет исключение. С finally
код очистки выполняет , однако вы покидаете блок, который, как правило, вы хотите.
Для получения дополнительной информации см. JLS section 14.20.2 - и обратите внимание, как все пути включают в себя выполнение блока finally
.
Наконец ВСЕГДА запускается на выполнение, независимо от того, что происходит в блоке Ьгу (неудовлетворительно, возврат, исключение, отделка и т.д.).
Если вы не хотите, чтобы этот код выполнялся, вы всегда можете поместить его после инструкции try/catch/finally.
За исключением случаев, когда JVM не живет для его запуска ;-) I.e. если JVM убивается или компьютер теряет мощность. –
Согласен ... но тогда НЕТ код будет запущен, что я считаю очевидным ...;) –
Это именно то, что finally
для: код внутри будет выполняться, когда try
блока остается, независимо от того, как (за исключением JVM выключая через System.exit()
или внешние причины).
Вы попробовали? Это очень легко проверить. –