Как использовать наконец - программирование
Подтвердить что ты не робот

Как использовать наконец

Я никогда не понимал, как использовать выражение finally. Может ли кто-нибудь сказать мне, в чем разница между:

try {
    a;
    block;
    off;
    statements;
} catch (Exception e) {
    handle;
    exception;
    e;
} finally {
    do;
    some;
    cleanup;
}

с одной стороны, и:

try {
    a;
    block;
    off;
    statements;
} catch (Exception e) {
    handle;
    exception;
    e;
}
do;
some;
cleanup;

С другой стороны,

4b9b3361

Ответ 1

Они отличаются, если

  • try -block завершается, выбирая java.lang.Throwable, который не является java.lang.Exception, например, потому что это java.lang.Error, например AssertionError или OutOfMemoryError.
  • блок try завершается внезапно, используя оператор потока управления, такой как continue, break или return
  • блокировка блокировки завершается внезапно (путем бросания любого throwable или с помощью оператора потока управления)

В более общем смысле, язык java гарантирует, что блок finally будет выполнен до завершения try-statement. (Обратите внимание, что если try-statement не завершен, в конце нет никакой гарантии. Оператор может не завершиться по целому ряду причин, включая аппаратное завершение работы, выключение ОС, выключение VM (например, из-за System.exit), ожидание потока (Thread.suspend(), synchronized, Object.wait(), Thread.sleep()) или занятость (бесконечные петли,,).

Таким образом, блок finally является лучшим местом для действий по очистке, чем конец тела метода, но сам по себе не может гарантировать освобождение от очистки.

Ответ 2

finally блок выполняется всегда.

Блок

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

Единственный раз, когда блок finally не выполняется, - это когда system.exit() вызывается в try/catch или возникает некоторая ошибка вместо исключения.

Ошибка в приведенном выше описании означает, что при выходе приложения Java с такими условиями, как ошибка "Из памяти". Я вижу несколько downvotes:( по этой причине кажется.

Ответ 3

Основное отличие состоит в том, что раздел catch может сам вызывать исключение, выходить из окружающего блока или возвращаться от текущего метода. В этом случае do; some; cleanup; не выполняется.

С блоком finally гарантируется, что этот код будет выполнен.

Ответ 4

В основном это плохая идея, чтобы поймать все исключения - так что вам нужно подумать о том, что произойдет, если неперехваченное исключение распространяется из вашего try/catch или try/catch/finally block. Наконец, блоки позволяют вам очистить выход.

также:

  • Блок catch может генерировать исключение
  • Вы можете вернуться из блока try

Короче говоря, если вы хотите, чтобы какой-то код выполнялся, когда вы покидали блок try/catch, но вы его оставляете (кроме того, что процесс заканчивается очень сложно), наконец, ваш друг.

Ответ 5

В правильном стиле кодирования вы не хотите делать все, как показано ниже.

try{
  [some task] 
}
catch
{
}

Что бы вы хотели сделать, это уловить известные известные ошибки.

try{
  [some task] 
}
catch(Exception ex)
{
   if([known execption])
     [ignore]
   else
     throw(ex);
}
[Cleanup]

В этом случае ваш код очистки не будет запущен в случае повторной ошибки. Таким образом, мы добавляем в finally, который будет запущен, даже если будет вызвана новая ошибка.

try{
  [some task] 
}
catch(Exception ex)
{
   if([known execption])
     [ignore]
   else
     throw(ex);
}
finally
{
   [Cleanup]
}

Ответ 6

Блок "finally" всегда будет выполняться.

В вашем втором примере очистка не произойдет, если блок catch перерисовывает исключение или если в блоке try произошел неперехваченный исключение.

Ответ 7

Из этот форум на GeekInterview:

Блок finally всегда выполняется, когда блок try завершается. Это гарантирует, что блок finally будет выполнен, даже если произойдет непредвиденное исключение. Но, наконец, полезно не только для обработки исключений - это позволяет программисту избежать случайного обхода кода очистки путем возврата, продолжения или разрыва. Включение кода очистки в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.

Ответ 8

Просто одна строка объяснения:

независимо от того, поймаете ли вы исключение или нет, коды в блоке finally будут выполнены.

различие между двумя приведенными вами частями: коды в части без использования finally никогда не будут выполнены.

чтобы правильно понять finally, все, что вам нужно знать, это finally= гарантировать!

вы можете использовать его для очистки, чтобы облегчить дружелюбие или повторить что-то.

Ответ 9

В первом примере блок finally всегда выполняется, даже если у вас есть оператор return в предложении try. Единственный раз, когда он не выполняется, - это когда у вас есть System.exit(0).