2010-02-04 11 views
5

So usare System.exit (0) può terminare un programma java, ad esempio, se ho una finestra JFrame, chiuderà e termina il programma, ma mi chiedo quanti altri modi, può essere chiuso e il programma essere finito? Compreso quando si verifica un errore, il programma si spegnerà e il JFrame verrà chiuso?In quanti modi un programma java può finire?

risposta

1

Un altro modo in cui termina il programma Java è quando viene eseguita l'ultima istruzione nel codice java. Anche quando si verifica l'errore java.lang.OutOfMemory, il programma termina in modo anomalo. Ciò si verifica quando Java Virtual Machine non è in grado di allocare un oggetto perché ha esaurito la memoria e non è possibile rendere disponibile più memoria dal garbage collector.

+0

Solo se main() è nullo. – bkritzer

+0

Cosa significa? Cosa succede se l'ultima riga di codice eseguita da un dato thread (ad esempio all'interno di un Runnable) viene eseguita ma ci sono altri thread non daemon attivi? – Adamski

+0

ya giusto, solo se main() è nullo. – Thunderhashy

0

Ho risposto alla tua domanda nel contesto delle GUI Swing in seguito alla tua segnalazione di JFrame.

  • Con una GUI Swing il thread di Invio eventi registra tutte le eccezioni che si verificano ma non risolvono l'applicazione in questa situazione.
  • Analogamente, se un altro thread genera un'eccezione e termina il thread di Invio evento si assicura che l'applicazione sia mantenuta attiva (poiché non è un thread daemon).
  • Un ultimo punto: se si desidera l'applicazione per essere terminato quando un JFrame è chiuso, è necessario chiamare: setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

In caso contrario, la cornice sarà semplicemente nascosto quando lo si chiude, ma l'applicazione continuerà correre.

2

Qui è tutto quello che posso pensare fuori della parte superiore della mia testa:

  1. principale ritorna() (o un valore o un vuoto() principali finisce di eseguire la sua ultima affermazione)

  2. programma genera un'eccezione non rilevata

  3. System.exit (int)

  4. Si può mandare in crash?

Nel tuo caso di una chiusura JFrame, credo che ci sarebbe stato un gestore onClose(), che sia chiama System.exit (0) o causa il metodo principale per tornare.

+2

In riferimento a 1 .: Se sono in esecuzione thread non Demonemon, il programma continuerà a essere eseguito anche dopo che main() è ritornato. – jeremytrimble

+0

JFrames hanno un metodo denominato 'setDefaultCloseOperation' che accetta una di queste costanti come argomento:' WindowConstants.HIDE_ON_CLOSE' (il valore predefinito), 'WindowConstants.DO_NOTHING_ON_CLOSE',' WindowConstants.DISPOSE_ON_CLOSE' e 'JFrame.EXIT_ON_CLOSE' – Powerlord

+0

Si prega di avere un'occhiata a questa risposta riguardante la fine di main(): http://stackoverflow.com/questions/2070951/main-function-does-not-return-anything-why/2070968#2070968 –

3

Un programma Java termina quando termina l'ultimo thread senza daemon flag o quando si chiama un metodo che arresta la macchina virtuale (System.exit(), Runtime.exit(), Runtime.halt() e possibilmente un qualcuno di più).

Tutto il resto appartiene alle librerie che chiamano System.exit() (come ad esempio un JFrame con EXIT_ON_CLOSE).

+1

Nit-picking, ma cosa succede se si registra un hook di chiusura che entra in un ciclo infinito quando viene eseguito? – Adamski

-1

È possibile utilizzare anche Application.exit().

+0

Piuttosto sicuro, 'Applicazione' è una classe di framework e non parte di JRE - potresti fornire il nome di classe completo? –

4

Per aggiungere ad altre risposte:

  • Se il processo che ospita il VM è forza terminato, il programma sarà spontaneamente scomparire
  • Lo stesso accade se il tappo viene tirato sulla macchina che ospita la VM :)
+1

ROFL. +1 per quello – DVK

+1

Non sto scherzando completamente :) Questo è in realtà uno scenario importante per un server che ha bisogno di fallire senza perdere dati. –

+1

+1 è uno degli scenari peggiori. Se non fosse per quello, la maggior parte del software ad alta disponibilità potrebbe essere ** molto ** più veloce. –

0

È possibile terminare un programma Java in esecuzione esternamente. Uccidendo il processo java.exe dal task manager (in caso di finestre)

Problemi correlati