как использовать, наконец
Я никогда должным образом не понимал использование выражения 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 ответов:
Они различаются, если
- блок
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
= гарантия!Вы можете использовать его для очистки, чтобы помочь с удобством для пользователя или повторить что-то