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

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

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;

На другом

37
задан Martijn 28 July 2010 в 16:00
поделиться

9 ответов

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

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

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

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

36
ответ дан 27 November 2019 в 04:09
поделиться

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

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

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

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

29
ответ дан 27 November 2019 в 04:09
поделиться

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

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

18
ответ дан 27 November 2019 в 04:09
поделиться

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

Также:

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

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

11
ответ дан 27 November 2019 в 04:09
поделиться

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

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

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

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

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

0
ответ дан 27 November 2019 в 04:09
поделиться

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

0
ответ дан 27 November 2019 в 04:09
поделиться

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

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

7
ответ дан 27 November 2019 в 04:09
поделиться

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

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

3
ответ дан 27 November 2019 в 04:09
поделиться

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

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]
}
9
ответ дан 27 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: