System.exit()
может использоваться для запуска перехватчиков до выхода из программы. Это удобный способ для завершения работы в больших программах, где все части программы не могут (и не должны) знать друг о друге. Затем, если кто-то хочет выйти из системы, он может просто позвонить System.exit()
, а перехватчики завершения работы (если они правильно настроены) позаботятся о выполнении всех необходимых церемоний отключения, таких как закрытие файлов, освобождение ресурсов и т. Д.
«Этот метод никогда не возвращается нормально». просто означает, что метод не вернется; как только нить идет туда, она не вернется.
Другой, может быть, более распространенный способ выхода из программы - просто достичь конца main
метода. Но если запущены какие-либо потоки, не являющиеся демонами, они не будут закрыты, и, следовательно, JVM не выйдет. Таким образом, если у вас есть такие потоки, не являющиеся демонами, вам нужны другие средства (кроме ловушек завершения), чтобы закрыть все потоки, не являющиеся демонами, и освободить другие ресурсы. Если нет других потоков, не являющихся демонами, возврат из него main
отключит JVM и вызовет перехватчики завершения работы.
По некоторым причинам, перехватчики отключения кажутся недооцененным и неправильно понятым механизмом, и люди заново изобретают колесо с помощью всевозможных запатентованных пользовательских хаков для выхода из своих программ. Я хотел бы поощрять использование крюков отключения; все это есть в стандартной среде выполнения, которую вы будете использовать в любом случае.