Я никогда правильно понял использование наконец оператор. Может любой говорить мне, между чем различие:
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;
На другом
Они отличаются, если
try
завершается выбросом java.lang.Throwable
, который не является java. lang.Exception
, например, потому что это java.lang.Error
, например AssertionError
или OutOfMemoryError
. continue
, break
или return
В более общем смысле, язык 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 завершается с такими условиями, как ошибка "Недостаточно памяти". Я вижу несколько голосов против :( по этой причине кажется.
Основное отличие состоит в том, что секция catch
сама может вызвать исключение, выйти из окружающего блока или вернуться из текущего метода. В этом случае да; немного; очистка;
не выполняется.
С блоком finally
гарантировано , что этот код будет выполнен.
По сути, перехват всех исключений - плохая идея, поэтому вам нужно подумать, что произойдет, если неперехваченное исключение распространится из вашего блока try / catch или try / catch / finally. Наконец блоки позволяют вам убирать на выходе.
Также:
Короче говоря, если вы хотите, чтобы некоторый код выполнялся, когда вы покидаете блок try / catch однако вы покидаете его (кроме того, что процесс завершается очень жестко), наконец, ваш друг.
Просто одна строка объяснения:
независимо от того, поймали ли вы исключение или нет, коды в блоке finally
будут выполнены.
разница между двумя частями, которые вы здесь указали, заключается в следующем: коды в фрагменте без использования finally
никогда не будут выполнены.
чтобы правильно понять finally
, все, что вам нужно знать, это то, что finally
= гарантия!
вы можете использовать его для очистки, для удобства пользователя или для повторной попытки что-то
В первом примере блок finally всегда выполняется, даже если у вас есть оператор return в предложении try. Единственный раз, когда он не выполняется, - это когда у вас есть System.exit (0).
Блок «finally» будет выполняться всегда.
Во втором примере очистка не произойдет, если блок catch повторно вызовет исключение или если в блоке try возникнет неперехваченное исключение.
Из этого форума на GeekInterview:
Блок finally всегда выполняется при выходе из блока try. Это гарантирует выполнение блока finally даже в случае возникновения непредвиденного исключения. Но наконец, он полезен не только для обработки исключений - он позволяет программисту избежать случайного обхода кода очистки при возврате, продолжении или прерывании. Помещение кода очистки в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.
В правильном стиле кодирования вы не хотите делать 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]
}