Запускается ли блок finally, даже если вы выбросили новое исключение? - PullRequest
124 голосов
/ 24 ноября 2010

В этом коде будет установлен 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;
    }
}

Ответы [ 6 ]

163 голосов
/ 24 ноября 2010

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

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

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

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

9 голосов
/ 24 ноября 2010

Да.

См. Документацию :

Блок finally всегда выполняется, когда блок try завершается.

Исключения:

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

1 голос
/ 23 марта 2016

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

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

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

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

1 голос
/ 24 ноября 2010

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

1 голос
/ 24 ноября 2010

Блок finally всегда выполняется при выходе из блока try . Если только вы не используете System.exit (0) в своем try или catch.

0 голосов
/ 03 апреля 2019

Наконец, блок всегда выполняется.

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Java Try Catch Finally Block with Throw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...