Я пытаюсь использовать блок finally без использования блоков try/catch, но получаю ошибку в Eclipse.
Можно ли использовать блок finally без использования блоков try/catch?
Я пытаюсь использовать блок finally без использования блоков try/catch, но получаю ошибку в Eclipse.
Можно ли использовать блок finally без использования блоков try/catch?
finally
должен иметь по крайней мере блок try
, catch
не является обязательным. Пункт блоков finally состоит в том, чтобы убедиться, что материал очищается от того, выбрано ли исключение или нет. Согласно JLS
Предложение finally гарантирует, что блок finally будет выполнен после блока try и любого блока catch, который может быть выполнен, независимо от того, как элемент управления покидает блок try или catch.
Следовательно, a finally
всегда должен предшествовать блок try
.
У вас должен быть блок try
с блоком finally
. Блок try
определяет, какие строки кода будут сопровождаться кодом finally
. Если перед блоком try
выбрано исключение, код finally
не будет выполняться.
Добавление блоков catch
необязательно:
try {
// something
} finally {
// guaranteed to run if execution enters the try block
}
try {
// Block of code with multiple exit points
}
finally {
// Block of code that must always be executed when the try block
// is exited, no matter how the try block is exited
}
Блок finally всегда выполняется, когда блок try завершается. Таким образом, вы можете использовать, наконец, без catch, но вы должны использовать try.
Подробнее... doc здесь
Причина, по которой вы не можете иметь finally
без try
, потому что у вас может быть несколько операторов finally
в той же области видимости, а try
указывает, к какому блоку кода относится finally
в случае возникает ошибка.
Еще одна интересная особенность finally
заключается в том, что она должна выполняться независимо от того, когда вводится try
. Например, что, если вы используете goto
, чтобы пропустить инструкцию finally
? Если goto
находится внутри try
, он будет выполнять оператор finally
, однако, если goto
находится выше/вне инструкции try
, тогда он пропустит код finally
. finally
относится только к коду, который окружен в try
. Если вы не пытаетесь, то finally
не имеет отношения ни к чему.
Из Oracle Trails:
Блок finally всегда выполняется, когда блок try завершается. Эта гарантирует, что блок finally будет выполнен, даже если неожиданное исключение.
Из приведенного выше утверждения вы не можете окончательно блокировать себя самостоятельно. ниже приведены допустимые комбинации.
попробовать поймать наконец
попробовать поймать
попробовать наконец
Код в блоке finally
гарантированно выполнится, если поток управления программой входит в соответствующий блок try
. Поэтому нет смысла иметь finally
без try
.
Единственное исключение: если программа встречает вызов System.exit(...)
перед блоком finally
, так как это завершает работу виртуальной машины.
Нет, вы не можете
вы можете использовать Try-catch-finally
или try-finally
try {
}catch (Exception e){
}
finally{
}
или
try {
}
finally{
}