System.exit()
może być użyty do uruchomienia haków zamykających przed zamknięciem programu. Jest to wygodny sposób radzenia sobie z zamykaniem w większych programach, w których wszystkie części programu nie mogą (i nie powinny) być świadome siebie. Następnie, jeśli ktoś chce odejść, może po prostu zadzwonić System.exit()
, a haki zamykania (jeśli są odpowiednio skonfigurowane) zajmują się wszystkimi niezbędnymi ceremoniami wyłączania, takimi jak zamykanie plików, zwalnianie zasobów itp.
„Ta metoda nigdy nie powraca normalnie”. oznacza tylko, że metoda nie zwróci; gdy nić trafi tam, nie wróci.
Innym, może bardziej powszechnym sposobem na wyjście z programu jest po prostu dotarcie do końca main
metody. Ale jeśli uruchomione są wątki niebędące demonami, nie zostaną one zamknięte, a zatem maszyna JVM nie zostanie zamknięta. Tak więc, jeśli masz takie wątki inne niż demony, potrzebujesz innych środków (oprócz haków zamykania), aby zamknąć wszystkie wątki inne niż demony i zwolnić inne zasoby. Jeśli nie ma innych wątków niebędących demonami, powrót z main
spowoduje zamknięcie JVM i wywołanie haków zamykania.
Z jakiegoś powodu haki zamykające wydają się być niedocenianym i źle zrozumianym mechanizmem, a ludzie wymyślają na nowo koło z wszelkiego rodzaju własnymi niestandardowymi hackami, aby wyjść z programów. Zachęcam do używania haków zamykających; to wszystko jest w standardowym środowisku uruchomieniowym , którego i tak będziesz używać.
Runtime.getRuntime().halt()
)W takim przypadku nie jest to konieczne. Żadne dodatkowe wątki nie zostaną uruchomione, nie zmieniasz kodu wyjścia (domyślnie 0) - w zasadzie nie ma sensu.
Kiedy dokumentacja mówi, że metoda nigdy nie zwraca normalnie, oznacza to, że kolejny wiersz kodu jest faktycznie nieosiągalny, nawet jeśli kompilator nie wie, że:
Zostanie zgłoszony wyjątek lub maszyna wirtualna zakończy działanie przed zwróceniem. Nigdy nie „po prostu wróci”.
Bardzo rzadko warto dzwonić na
System.exit()
IME. Może to mieć sens, jeśli piszesz narzędzie wiersza polecenia i chcesz wskazać błąd za pomocą kodu wyjścia, a nie tylko zgłaszać wyjątek ... ale nie pamiętam, kiedy ostatni raz użyłem go w normalnym kodzie produkcyjnym .źródło
System.exit()
nigdy nie zakończy się normalnie - zawsze albo zakończy się z wyjątkiem, albo zamknie maszynę wirtualną (która tak naprawdę nie jest objęta JLS).Metoda nigdy nie zwraca, ponieważ jest to koniec świata i żaden z Twoich kodów nie zostanie wykonany w następnej kolejności.
Twoja aplikacja w twoim przykładzie i tak by się zakończyła w tym samym miejscu w kodzie, ale jeśli użyjesz System.exit. masz możliwość zwrócenia niestandardowego kodu do środowiska, na przykład powiedzmy
Kto skorzysta z Twojego kodu wyjścia? Skrypt, który wywołał aplikację. Działa w systemach Windows, Unix i wszystkich innych środowiskach skryptowych.
Po co zwracać kod? Aby powiedzieć rzeczy takie jak „nie udało mi się”, „Baza danych nie odpowiedziała”.
Aby zobaczyć, jak uzyskać wartość kodu wyjścia i użyć go w skrypcie powłoki unix lub skrypcie cmd systemu Windows, możesz sprawdzić tę odpowiedź na tej stronie
źródło
System.exit(0)
kończy JVM. W takich prostych przykładach trudno dostrzec różnicę. Parametr jest przekazywany z powrotem do systemu operacyjnego i zwykle jest używany do wskazania nieprawidłowego zakończenia (np. Jakiś błąd krytyczny), więc jeśli wywołałeś java z pliku wsadowego lub skryptu powłoki, możesz uzyskać tę wartość i uzyskać pomysł jeśli aplikacja zakończyła się powodzeniem.Miałoby to duży wpływ, jeśli
System.exit(0)
wywołałeś aplikację wdrożoną na serwerze aplikacji (pomyśl o tym przed wypróbowaniem).źródło
W aplikacjach, które mogą mieć skomplikowane haki zamykania, tej metody nie należy wywoływać z nieznanego wątku.
System.exit
nigdy nie kończy normalnie, ponieważ wywołanie zostanie zablokowane, dopóki JVM nie zostanie zakończone. To tak, jakby działający kod miał wyciągniętą wtyczkę przed zakończeniem. WywołanieSystem.exit
spowoduje zainicjowanie haków zamykania programu, a każdy wątek, którySystem.exit
wywoła, będzie blokowany aż do zakończenia programu. Ma to implikację, że jeśli hak zamykający z kolei prześle zadanie do wątku, z któregoSystem.exit
został wywołany, program zablokuje się.Zajmuję się tym w moim kodzie w następujący sposób:
źródło
Chociaż odpowiedź była naprawdę pomocna, ale niektórzy pominęli jakieś dodatkowe szczegóły. Mam nadzieję, że poniżej pomoże zrozumieć proces zamykania w java, oprócz powyższej odpowiedzi:
PS: JVM może zostać zamknięty w sposób uporządkowany lub nagły .
źródło
NIGDY nie należy dzwonić
System.exit(0)
z następujących powodów:Wyjście z programu „normalnie” zapewnia ten sam kod wyjścia dla systemu operacyjnego, ponieważ
System.exit(0)
jest nadmiarowy.Jeśli twój program nie może wyjść „normalnie”, straciłeś kontrolę nad swoim rozwojem [projekt]. Zawsze powinieneś mieć pełną kontrolę nad stanem systemu.
Nawiasem mówiąc: Zwracanie innych kodów powrotu niż 0 ma sens, jeśli chcesz wskazać nieprawidłowe zakończenie programu.
źródło
Potrzebny jest System.exit
W twoim przypadku robi dokładnie to samo, co zwykły powrót z głównego.
źródło
exit
jest to twoja jedyna opcja.exit
. Nie jedyna opcja, ale zdecydowanie opcja warta rozważenia.Mówi to specyfikacja języka Java
Oznacza to, że powinieneś go używać, gdy masz duży program (cóż, przynajmniej większy od tego) i chcesz zakończyć jego wykonywanie.
źródło
Jeśli w JVM działa inny program i korzystasz z System.exit, ten drugi program również zostanie zamknięty. Wyobraź sobie na przykład, że uruchamiasz zadanie Java w węźle klastra i że program Java, który zarządza węzłem klastra, działa w tej samej maszynie JVM. Jeśli zadanie użyje System.exit, nie tylko zamknie zadanie, ale także „zamknie cały węzeł”. Nie można wysłać kolejnego zadania do tego węzła klastra, ponieważ program zarządzania został przypadkowo zamknięty.
Dlatego nie używaj System.exit, jeśli chcesz mieć możliwość kontrolowania swojego programu z innego programu Java w tej samej JVM.
Użyj System.exit, jeśli chcesz celowo zamknąć pełną JVM i jeśli chcesz skorzystać z możliwości opisanych w innych odpowiedziach (np. Haki zamykania: hak zamykania Java , niezerowa wartość zwracana dla wiersza poleceń wywołania: jak uzyskać status wyjścia programu Java w pliku wsadowym Windows ).
Zobacz także wyjątki Runtime: System.exit (num) lub wyrzucić RuntimeException z main?
źródło