Есть ли вероятность того, что блок finally не может быть выполнен? - PullRequest
8 голосов
/ 10 марта 2010

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

И если System.exit () вызывается либо в try, либо в catch, то также будет вызываться метод finally?

Ответы [ 8 ]

21 голосов
/ 10 марта 2010

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

Источник: java.sun.com: Учебное руководство по Java: Блок finally

6 голосов
/ 10 марта 2010

System.exit() предотвратит выполнение блока finally.

3 голосов
/ 10 марта 2010
try {
    System.out.println("BEFORE");
    System.exit(0);
    System.out.println("AFTER");
} finally {
    System.out.println("FINALLY");
}

это даст вам вывод:

BEFORE
3 голосов
/ 10 марта 2010

В документации Java:

http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

Это объясняет, наконец, очень хорошо.

Они отмечают, что если JVM завершает работу, то блок finally будет не вызываться Или, если поток, выполняющий блок кода, будет уничтожен, блок finally будет вызываться , а не . Во всех остальных случаях это будет.

2 голосов
/ 10 марта 2010

Одна вещь, о которой я могу подумать сейчас, это OutOfMemoryError, и в этом случае есть вероятность того, что никакой дополнительный код в вашем приложении не может быть выполнен.

1 голос
/ 10 марта 2010

System.exit (1); Вы можете использовать

0 голосов
/ 19 сентября 2015

Предложение finally в блоке исключений try-catch всегда выполняется независимо от возникновения исключения в обычном потоке Java-программ. Если поток выполнения останавливается перед предложением finally, тогда блок finally не будет выполнен.

мы можем использовать System.exit(1); перед окончательной блокировкой и остановкой потока выполнения программы.

0 голосов
/ 10 марта 2010

Если какой-либо метод Java Native Interface segfaults (библиотечная функция вне java, но вызванная оттуда вызывает сбой), метод finally также не будет вызван, потому что вся JVM останавливается.

Ошибки в самой JVM также приводят к сбою и препятствуют дальнейшему выполнению всего.

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