2010-02-04 30 views
5

Wiem, że użycie System.exit (0) może zakończyć program java, na przykład, jeśli mam okno JFrame, to zamknie i zakończy program, ale zastanawiam się, ile innych sposobów, można go zamknąć, a program być zakończone? Czy w przypadku wystąpienia błędu program zostanie zamknięty, a JFrame zostanie zamknięte?Ile sposobów może zakończyć się program java?

Odpowiedz

1

Innym sposobem zakończenia pracy programu Java jest wykonanie ostatniej instrukcji w kodzie Java. Również w przypadku wystąpienia błędu java.lang.OutOfMemory, program kończy się nieprawidłowo. Dzieje się tak, gdy wirtualna maszyna języka Java nie może przydzielić obiektu, ponieważ nie ma w nim pamięci, a moduł czyszczący nie może udostępnić więcej pamięci.

+0

Tylko jeśli funkcja main() jest nieważna. – bkritzer

+0

Co to oznacza? Co się stanie, jeśli ostatni wiersz kodu wykonywany przez dany wątek (np. W obrębie Runnable) zostanie wykonany, ale istnieją inne wątki inne niż demony? – Adamski

+0

ya right, tylko jeśli main() jest nieważne. – Thunderhashy

0

Odpowiedziałem na twoje pytanie w kontekście GUI Swinga, biorąc pod uwagę Twoją wzmiankę o JFrame.

  • W interfejsie graficznym Swing wątek z powiadomieniem o zdarzeniu będzie rejestrować wszystkie wyjątki, które wystąpią, ale nie zakończy aplikacji w tej sytuacji.
  • Podobnie, jeśli inny wątek zgłasza wyjątek i kończy wątek Wysłanie zdarzenia, zapewnia to, że aplikacja jest utrzymywana przy życiu (ponieważ nie jest to wątek demona).
  • Jeden punkt końcowy: Jeśli chcesz aplikacji mają być zakończone, gdy JFrame jest zamknięty, trzeba zadzwonić: setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Inaczej rama będzie po prostu ukryty kiedy go zamknąć, ale aplikacja będzie nadal biegać.

2

Oto wszystko, co mogę myśleć poza czubek głowy:

  1. main() zwraca (albo wartości lub void() Główny wykończeń wykonujących swoją ostatnią wypowiedź)

  2. programu zgłasza wyjątek nieprzechwycony

  3. System.exit (int)

  4. może załamać?

W twoim przypadku zamknięcia JFrame, wierzę, że byłby onClose() obsługi, które albo wywołuje System.exit (0) lub powoduje główną metodę powrotu.

+2

W odniesieniu do 1 .: Jeśli istnieją wątki inne niż deaemon, program będzie działał nawet po zwróceniu metody main(). – jeremytrimble

+0

JFrames mają metodę o nazwie 'setDefaultCloseOperation', która przyjmuje jedną z tych stałych jako argument:' WindowConstants.HIDE_ON_CLOSE' (domyślnie), 'WindowConstants.DO_NOTHING_ON_CLOSE',' WindowConstants.DISPOSE_ON_CLOSE' i 'JFrame.EXIT_ON_CLOSE' – Powerlord

+0

Proszę mieć spójrz na tę odpowiedź dotyczącą końca main(): http://stackoverflow.com/questions/2070951/main-function-does-not-return-anything-why/2070968#2070968 –

3

Program Java kończy się po zakończeniu ostatniego wątku bez flagi demona lub po wywołaniu metody wyłączającej maszynę wirtualną (System.exit(), Runtime.exit(), Runtime.halt() i ewentualnie trochę więcej).

Wszystko inne zależy od bibliotek wywołujących funkcję System.exit() (takich jak JFrame z EXIT_ON_CLOSE).

+1

Nit-picking, ale co się stanie, jeśli zarejestrujesz hak zamykający, który wejdzie w nieskończoną pętlę, gdy będzie działał? – Adamski

-1

Możesz również użyć Application.exit().

+0

Jestem pewien, że 'Application' to tylko klasa framework, a nie część JRE - czy mógłbyś podać pełną kwalifikowaną nazwę klasy? –

4

Aby dodać do innych odpowiedzi:

  • Jeśli proces, który jest gospodarzem VM jest mocno zakończony, program będzie samoistnie znikają
  • To samo dzieje się, gdy wtyczka zostanie wyciągnął na maszynie hostingu VM :)
+1

ROFL. +1 dla tego – DVK

+1

Nie żartuję całkowicie :) Jest to właściwie ważny scenariusz dla serwera, który musi zakończyć się niepowodzeniem bez utraty danych. –

+1

+1 to jeden z najgorszych scenariuszy. Gdyby nie to, większość oprogramowania o wysokiej dostępności mogło być ** znacznie ** szybsze. –

0

Możesz zakończyć uruchomiony program Java na zewnątrz. Przez zabicie procesu java.exe z menedżera zadań (w przypadku systemu Windows)

Powiązane problemy