2013-07-02 3 views
4

когда блок finally не выполняется при попытке или блокировке блока прерван? в документе говорится, что «если поток, выполняющий код try или catch, прерывается или убивается, блок finally может не выполняться, даже если приложение в целом продолжается». может ли кто-нибудь привести пример об этой ситуации?, когда блок finally не выполняется, когда блок try или catch прерван

+0

Так что вопрос? – Caveman42

+0

@RAS да, и в [Действительно ли выполняется в Java?] (Http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java), я нахожу то, что хочу знать. Но, что я имею в виду, не тождественно этому вопросу. Однако ответ существует. – andy

ответ

8

Ответы могут быть найдены here.

Помимо System.exit(), блок finally не будет работать, если JVM по какой-то причине сбой (например, бесконечный цикл в вашем блоке try).

Что касается самой нити, только если он остановлен с использованием методы stop() (или suspend() без resume()) будет ли finally блока не может быть выполнен. Вызов interrupt() по-прежнему приведет к выполнению блока finally.

Стоит также отметить, что, так как любое return заявления в finally блоке перекрывает любые возвращения или исключения бросков в блоках try/catch, поведение программы может быстро стать непредсказуемым и трудно отлаживать, если это произойдет с вами. На самом деле ничего не стоит принимать меры предосторожности (как это происходит только в крайне редких случаях), но стоит осознавать, что вы можете узнать это, когда это произойдет.

+0

спасибо за ваш ответ, но то, что я действительно хочу найти, - это значение прерывания в предложении **, если поток, выполняющий код try или catch, прерван или убит, блок finally может не выполняться, даже если приложение в целом продолжается. **. Означает ли это остановка для ** stop() ** или ** suspend() **. Как и в вашем ответе, вызов ** прерывания() ** не останавливает выполнение ** окончательно **. – andy

+0

Is [this] (http://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt-do) что вы ищете? –

+0

Да, большое спасибо. – andy

7

Единственный законный способ сделать finally не выполнить это вызов System.exit или Runtime.halt в try или catch

1

Круто окончание приложения перед ним, например,

System.exit(); 

Даже возвращение перед тем finally блока (например, в блоке try) будет выполняться после finally.

1

Это относится к вещам, которые (в основном) находятся за пределами оболочки обычного Java-исполнения.

  • Если нить (успешно) вызывает System.exit() в try блоке или catch блока, что вызов не будет «прекратить» в том смысле, в JLS. То же самое происходит, если другой поток вызывает System.exit(). В этом случае JVM только запускает крюки остановки.

  • Если JVM (жесткий) аварийно завершает работу, вся активность Java прекращается мгновенно.

  • Если ОС (жесткий) убивает процесс JVM, вся активность Java прекращается мгновенно.

  • Если питание на микросхему процессора уходит ...