Как использовать наконец
Я никогда не понимал, как использовать выражение 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;
С другой стороны,
Ответы
Ответ 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).