Код не доходит до "окончательного" блока

Данный код java не идет в блок finally , я думал, что эти блоки должны были выполнять независимо от того, что:

public static void main(String[] args) {
    try {
        System.out.println("Hello world");
        System.exit(0);
    } finally {
        System.out.println("Goodbye world");
    }
}
3
+1 Интересный вопрос, формулировка просто затрудняет определение того, что вы хотите знать.
добавлено автор Aaron Digulla, источник
@romaintaz, похоже, мы перешли на редактирование, но, поскольку мой переформатирование кода также включало ваше окончательное изменение, я уйду как есть.
добавлено автор paxdiablo, источник
Какое исключение?
добавлено автор Jigar Joshi, источник
Я изменил заголовок, чтобы удалить exception и заменить на finally . И даже с блоком catch , вопрос остается тем же ...
добавлено автор romaintaz, источник
Блока catch не существует и исключение отсутствует. Что вы ожидаете?
добавлено автор Fabian Schmengler, источник
В коде нет исключения
добавлено автор user948620, источник

5 ответы

System.exit(0);

will unload the JVM i.e no further java instructions are processed That is the reason for not being exicuting the finally{}

5
добавлено

Как указано в Java 6 < code> System.exit() docs :

Вызов System.exit (n) фактически эквивалентен вызову: Runtime.getRuntime (). exit (n)

И, если вы идете и смотрите Runtime.exit() (мой жирный шрифт):

Завершает работу текущей виртуальной машины Java, инициировав ее последовательность выключения. Этот метод никогда не возвращается нормально.

     

Последовательность выключения виртуальной машины состоит из двух фаз. На первом этапе все зарегистрированные крючки остановки, если они есть, запускаются в определенном неуказанном порядке и разрешены для запуска одновременно до их завершения. На втором этапе все неинвинированные финализаторы запускаются, если включена опция финализация на выходе. После этого виртуальная машина останавливается.

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

4
добавлено
Спасибо, что было действительно описательно и полезно.
добавлено автор newUser, источник

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

4
добавлено

Метод System.exit останавливает выполнение текущего потока и всех остальных потоков. Присутствие, наконец, не дает нить специальное разрешение на продолжение выполнения.

A previous discusses this in great detail. How does Java's System.exit() work with try/catch/finally blocks?

2
добавлено

По System.exit (0) Вы выходите из Jvm, поэтому никакие строки после этого не будут выполнены, и именно поэтому вы находите свой блок finally как неисполненный.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async