Подтвердить что ты не робот

Выполняется ли окончательный блок, даже если вы выбрали новое исключение?

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

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
4b9b3361

Ответ 1

Да, блоки finally всегда выполняются... кроме тех случаев, когда:

  • Поток, выполняющий блок try-catch-finally, убит или прерван
  • Вы используете System.exit(0);
  • Базовая виртуальная машина уничтожается каким-то другим способом.
  • Основное аппаратное обеспечение в некотором роде неприменимо

Кроме того, если метод в вашем блоке finally выдает неперехваченное исключение, после этого ничего не будет выполнено (т.е. исключение будет выбрано так же, как в любом другом коде). Очень распространенным случаем, когда это происходит, является java.sql.Connection.close().

В стороне, я предполагаю, что образец кода, который вы использовали, является всего лишь примером, но будьте осторожны, чтобы положить фактическую логику в блок finally. Блок finally предназначен для очистки ресурсов (закрытие соединений DB, освобождение дескрипторов файлов и т.д.), А не для обязательной логики. Если он должен запускаться, сделайте это перед блоком try-catch, от чего-то, что может вызвать исключение, так как ваше намерение почти наверняка будет функционально одинаковым.

Ответ 2

Да.

Смотрите документацию :

Блок finally всегда выполняется, когда выключение блока try.

Исключения:

Примечание. Если JVM выходит во время попытки или код catch, тогда блок finally может не выполняться. Аналогично, если поток, выполняющий попытка или уловка кода прерывается или убит, блок finally может не выполняются, хотя приложение как целое продолжается.

Ответ 4

Да. Блок finally выполняется всегда, за исключением случая, когда вы вызываете System.exit(), потому что он останавливает Java VM.

Ответ 5

Наконец, всегда выполняется, независимо от того, что вы делаете: i.e

  • блок try-catch-finally
  • throws

Для неконтролируемых исключений java не требует обработки ошибок. это является причиной того, что если в конечном блоке выполняется исключенное исключение, и для этого не выполняется обработка, тогда код, написанный ниже этой точки (где произошла ошибка), не будет выполнен.

Поэтому я предлагаю всегда обрабатывать все исключения, если он может быть проверен или снят. таким образом, вы можете убедиться, что блок кода в конечном итоге также выполняется независимо от того, происходит ли также исключение исключения. у вас есть место в улове вложенного гнезда и, наконец, блок, чтобы выполнить вашу необходимую работу.