2010-04-16 12 views
9

Sto scrivendo un programma applicativo utilizzando swing. Ho bisogno di uscire dall'applicazione facendo clic sul JButton per quello posso usare System.exit() o dovrei usare alcuni altri metodi, che è la migliore pratica. Se chiamare System.exit() non è la procedura consigliata, indicare il motivo e indicare il modo alternativo di uscire dall'applicazione.System.exit (0) in java

risposta

6

Personnaly, io considero la procedura migliore per lasciare che l'applicazione si chiuda da sola: se si scrive una classe principale con un main(String[] args), con codice vuoto, l'esecuzione uscirà automaticamente dal programma Java.

Ma, nella maggior parte delle volte, come la maggior parte di sviluppatori, mi baso su System.exit(/an exit code/), soprattutto per le applicazioni Swing, in cui lo Swing EDT verrà eseguito senza fine, come ha scritto justkt .. La drawxback noto di questo metodo è che la maggior parte di codice applciation non viene chiamato, cosa evito impostando un hook di shutdown chiamando Runtime.addShutdownHook(Thread), che mi consentirà di pulire l'applicazione (chiudere i thread e così via).

+1

L'uscita di un'applicazione da sola funziona per applicazioni non GUI, ma con Swing si ha la coda eventi e il thread eventi, di cui non si ha il controllo, che non si spegnerà senza alcun modulo (programmatico o facendo clic una 'x' su un JFrame) di intervento dell'utente. – justkt

3

Se è necessario impostare un codice di uscita per l'applicazione, è necessario utilizzare System.exit (credo).

Ma quando non hai bisogno di un codice specifico (o 0 va bene), allora preferirei che la JVM terminasse "naturalmente", cosa che accade quando non ci sono più (non daemon) thread rimasti.

Di solito, si raggiunge la fine del metodo principale.

Farei attenzione a System.exit perché potrebbero esserci altri thread che devono ancora fare qualcosa e uscire senza chiuderli correttamente potrebbe causare danni. Ad esempio il database incorporato potrebbe ancora aver bisogno di svuotare i suoi buffer.

Se si conoscono questi thread, di solito è possibile fare in modo che terminino correttamente. Se non sai quali thread sono in esecuzione nel tuo programma, hai problemi più grandi ...

+0

Se il metodo principale genera un'eccezione, java genererà un altro codice di uscita (130, se lo ricordo correttamente). – whiskeysierra

2

System.exit può essere cattivo almeno quando hai più thread o risorse che devono essere chiuse correttamente (che vivono al di fuori di JVM). Se la tua applicazione non si sta esaurendo quando pensi che dovrebbe, dovresti scoprire qual è il problema e non chiamare semplicemente System.exit().

L'unico motivo per cui si chiama System.exit() potrebbe non fornire alcun codice di uscita standard.

3

In generale, l'unica volta che è necessario eseguire un System.exit (n) è se si desidera uscire da un programma della riga comandi con un codice di errore in modo che tutto ciò che sta monitorando il programma possa rilevare il codice di errore.

Questo è molto utile ad esempio, se si sta scrivendo un programma progettato per essere eseguito da uno script di shell.

Come altri repliche dire, però, se si utilizza le discussioni allora si deve fare ogni sforzo per farli chiudere con grazia prima di considerare uno System.exit (n)

10

In generale, chiamando System.exit(...) ovunque, ma il "principale" il metodo di un'applicazione può essere problematico per (almeno) i seguenti motivi.

  • È un impedimento per riutilizzare il codice.

  • Rende difficile il test dell'unità.Ad esempio, se il tuo codice chiama System.exit quando i test JUnit esercitano una gestione degli errori, che è la fine della sequenza di test!

Il caso specifico di chiamare System.exit(...) nel pulsante listener per il pulsante "uscita" non è poi così male. È improbabile che tu voglia riutilizzare il listener dei pulsanti da qualche parte che non richiede questo comportamento. Inoltre, probabilmente puoi trovare un modo per risolvere il problema dell'unità; per esempio. non testare unitamente quel particolare metodo!

Tuttavia, penso che proverei ancora ad ottenere l'uscita in modo diverso. Ad esempio, avere il metodo main avviare tutto e quindi bloccare su CountDownLatch, quindi fare in modo che il listener dei pulsanti riduca il latch. Quando il metodo main viene sbloccato, esegue il codice di arresto pertinente e restituisce o chiude come appropriato.

+0

+1 per rendere difficile il test delle unità! "Perché i miei test unitari non sono completati ???" –

Problemi correlati