когда блок finally не выполняется при попытке или блокировке блока прерван? в документе говорится, что «если поток, выполняющий код try или catch, прерывается или убивается, блок finally может не выполняться, даже если приложение в целом продолжается». может ли кто-нибудь привести пример об этой ситуации?, когда блок finally не выполняется, когда блок try или catch прерван
ответ
Ответы могут быть найдены here.
Помимо System.exit()
, блок finally не будет работать, если JVM по какой-то причине сбой (например, бесконечный цикл в вашем блоке try
).
Что касается самой нити, только если он остановлен с использованием методы stop()
(или suspend()
без resume()
) будет ли finally
блока не может быть выполнен. Вызов interrupt()
по-прежнему приведет к выполнению блока finally
.
Стоит также отметить, что, так как любое return
заявления в finally
блоке перекрывает любые возвращения или исключения бросков в блоках try
/catch
, поведение программы может быстро стать непредсказуемым и трудно отлаживать, если это произойдет с вами. На самом деле ничего не стоит принимать меры предосторожности (как это происходит только в крайне редких случаях), но стоит осознавать, что вы можете узнать это, когда это произойдет.
спасибо за ваш ответ, но то, что я действительно хочу найти, - это значение прерывания в предложении **, если поток, выполняющий код try или catch, прерван или убит, блок finally может не выполняться, даже если приложение в целом продолжается. **. Означает ли это остановка для ** stop() ** или ** suspend() **. Как и в вашем ответе, вызов ** прерывания() ** не останавливает выполнение ** окончательно **. – andy
Is [this] (http://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt-do) что вы ищете? –
Да, большое спасибо. – andy
Единственный законный способ сделать finally
не выполнить это вызов System.exit
или Runtime.halt
в try
или catch
Круто окончание приложения перед ним, например,
System.exit();
Даже возвращение перед тем finally
блока (например, в блоке try
) будет выполняться после finally
.
Это относится к вещам, которые (в основном) находятся за пределами оболочки обычного Java-исполнения.
Если нить (успешно) вызывает
System.exit()
вtry
блоке илиcatch
блока, что вызов не будет «прекратить» в том смысле, в JLS. То же самое происходит, если другой поток вызываетSystem.exit()
. В этом случае JVM только запускает крюки остановки.Если JVM (жесткий) аварийно завершает работу, вся активность Java прекращается мгновенно.
Если ОС (жесткий) убивает процесс JVM, вся активность Java прекращается мгновенно.
Если питание на микросхему процессора уходит ...
Так что вопрос? – Caveman42
@RAS да, и в [Действительно ли выполняется в Java?] (Http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java), я нахожу то, что хочу знать. Но, что я имею в виду, не тождественно этому вопросу. Однако ответ существует. – andy