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


Я никогда должным образом не понимал использование выражения 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;

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

9 37

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 является лучшим местом для очистительных действий, чем конец тела метода, но сам по себе все еще не может гарантировать очистка выполнение запроса.

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

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

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

Ошибка в описании выше означает, что при выходе Java-приложения с условиями типа Out Of Ошибка памяти. Я вижу некоторые понижающие ноты : (по этой причине, кажется.

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

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

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

Также:

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

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

В правильном стиле кодирования вы не хотите делать 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]
}

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

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

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

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

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

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

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

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

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

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