Что такое «внезапное завершение предложения finally»? - PullRequest
3 голосов
/ 25 декабря 2008

Согласно спецификации языка Java :

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

Кроме возврата внутри блока finally, какие еще есть способы?

Ответы [ 3 ]

6 голосов
/ 25 декабря 2008

Создание исключения из блока finally также приведет к засорению исходного исключения (если оно есть).

РЕДАКТИРОВАТЬ: нашел ссылку, объясняющую "внезапное завершение".
С §14.1: Нормальное и внезапное завершение операторов :

Резкое завершение всегда имеет связанная причина, которая является одной из следующее:

  • Перерыв без метки
  • разрыв с заданной меткой
  • A продолжить без метки
  • A продолжить с данной меткой
  • возврат без значения
  • возврат с заданным значением
  • Бросок с заданным значением, включая исключения, выданные виртуальная машина Java

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

0 голосов
/ 25 декабря 2008

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

0 голосов
/ 25 декабря 2008

Sys.exit() или принудительное прерывание. В частности, программы с графическим интерфейсом известны тем, что вызывают Sys.exit() для исключения, частично из-за ошибки, которая сохранилась до JVM 1.5 - исключение, выброшенное из потока GUI, не перешло в основной поток.

Обновление: особенно для тех, кто отрицал это. Извините, но Sys.exit () делает именно то, что подразумевается под внезапным завершением, включая то, что стек не разматывается; Я буду сообщать об ошибке в документации завтра. Я могу говорить об этом с некоторым авторитетом, будучи несколько лет старшим архитектором Java в Sun.

...