Jak zamknąć aplikację Java z poziomu programu


145

Jaki jest najlepszy sposób na zamknięcie aplikacji Java zawierającej kod?


1
Hmm. Myślę, że pytanie może być zbyt ogólne. Zakończyć w jakich okolicznościach?
Allen George

3
Czy wszystkie twoje wątki niebędące demonami kończą się normalnie?
Thorbjørn Ravn Andersen

Odpowiedzi:


192

Możesz użyć System.exit()do tego celu.

Zgodnie z dokumentacją Oracle dotyczącą języka Java 8:

public static void exit(int status)

Kończy aktualnie uruchomioną wirtualną maszynę Java. Argument służy jako kod statusu; Zgodnie z konwencją niezerowy kod statusu wskazuje na nieprawidłowe zakończenie .

Ta metoda wywołuje metodę wyjścia w klasie Runtime. Ta metoda nigdy nie zwraca normalnie.

Wezwanie System.exit(n)jest w rzeczywistości równoznaczne z wezwaniem:

Runtime.getRuntime().exit(n)


102
System.exit(0);

Wartość „0” informuje osobę dzwoniącą do programu, że wszystko poszło dobrze. Jeśli jednak rezygnujesz z pracy z powodu błędu, powinieneś System.exit(1);lub z inną niezerową liczbą odpowiadającą określonemu błędowi.

Ponadto, jak wspominali inni, najpierw posprzątaj! Obejmuje to zamykanie plików i innych otwartych zasobów.


Myślałem, że to System.exit (1)?
AFK

14
Jak stwierdza Chris, System.exit(1)(lub jakakolwiek inna liczba) jest wtedy, gdy chcesz wskazać, że został zamknięty z powodu błędu. System.exit(0)wskazuje, że program został normalnie zamknięty. Możesz również zmienić 1 na dowolną liczbę, a następnie uruchamiając aplikację ze skryptu, możesz określić, czy wystąpił błąd.
StormPooper

10

System.exit(int i)ma zostać użyty, ale umieściłbym go w bardziej ogólnej shutdown()metodzie, w której uwzględniałbyś również kroki "czyszczenia", zamykając połączenia gniazd, deskryptory plików, a następnie kończąc za pomocą System.exit(x).


6

System.exit() zwykle nie jest najlepszym sposobem, ale zależy to od aplikacji.

Zwykłym sposobem zakończenia aplikacji jest wyjście z main()metody. To nie działa, gdy działają inne nie-demoniczne wątki, jak to zwykle bywa w przypadku aplikacji z graficznym interfejsem użytkownika (AWT, Swing itp.). W przypadku tych aplikacji albo znajdujesz sposób na zakończenie pętli zdarzeń GUI (nie wiem, czy jest to możliwe w przypadku AWT czy Swing), albo wywołanie System.exit().


4

Używanie dispose();jest bardzo skutecznym sposobem zamykania programów.

Zauważyłem, że użycie System.exit(x)resetuje panel interakcji i jeśli potrzebujesz niektórych informacji, wszystko znika.


3

Zgadzam się z Jonem, niech twoja aplikacja zareaguje na coś i wywołaj System.exit ().

Być pewnym że:

  • używasz odpowiedniej wartości wyjścia. 0 to normalne wyjście, cokolwiek innego wskazuje, że wystąpił błąd
  • zamykasz wszystkie strumienie wejściowe i wyjściowe. Pliki, połączenia sieciowe itp.
  • rejestrujesz lub drukujesz powód wyjścia, zwłaszcza jeśli jest to spowodowane błędem

2

Odpowiedzią jest System.exit (), ale nie jest to dobra rzecz, ponieważ powoduje to przerwanie programu. Żadne sprzątanie, niszczenie, które zamierzasz zrobić, nie nastąpi.


1

Są dwie proste odpowiedzi na to pytanie.

Oto „profesjonalny sposób”:

//This just terminates the program.
System.exit(0);

To jest bardziej niezdarny sposób:

//This just terminates the program, just like System.exit(0).
return;

System.exit(0); return;jest również dobry, powrót zapobiega uruchomieniu jakiegokolwiek innego kodu przed zamknięciem systemu, w przeciwnym razie potrzebna i.e. if (!called_exit) { further code after exit statement }
byłaby

-1
Runtime.getCurrentRumtime().halt(0);

1
Lepiej: Runtime.getRuntime (). Halt (0); W Scali zadziałało idealnie!
Gerhard Hagerer

@GerhardHagerer, ale co, jeśli dostaniesz nieaktualne runti, ja?
Koleś, bracie,

1
Z języka Javadoc dla halt: „Tej metody należy używać z dużą ostrożnością. W przeciwieństwie do exitmetody ta metoda nie powoduje uruchamiania przechwytywania zamykania systemu i nie uruchamia nie wywołanych finalizatorów, jeśli włączono finalizację przy wyjściu. Jeśli sekwencja zamykania została włączona została już zainicjowana, to ta metoda nie czeka, aż jakiekolwiek działające punkty zaczepienia zamykania lub finalizatory zakończą swoją pracę. " Krótko mówiąc, nie powinieneś go używać halt, powinieneś preferować exit.
Erwin Bolwidt

-1

System.exit()zrobisz, co chcesz. Ale w większości sytuacji prawdopodobnie chcesz wyjść z wątku i pozostawić główny wątek żywy. W ten sposób możesz zakończyć zadanie, ale także zachować możliwość rozpoczęcia kolejnego zadania bez ponownego uruchamiania aplikacji.



-3

Powinno to zrobić to we właściwy sposób:

mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowListener() {

@Override
public void windowClosing(WindowEvent e) {
    if (doQuestion("Really want to exit?")) {
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainFrame.dispose();
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.