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