2013-03-19 19 views
5

Ho un programma java interattivo che consente all'utente di inviare messaggi a un server, che si comporta come una shell, accetta l'input da tastiera dell'utente ed esegue varie azioni.Come arrestare correttamente un programma da riga di comando java

Per esempio

myProgram> send "Login as James" to server 

Il mio programma analizzerà l'input dell'utente e eseguire l'azione, in questo caso, invierà il messaggio "Login come James" al server.

Uno del comando che supporto il suo "quit", che chiuderà tutta la connessione al server, ripulirà le risorse e spegnerà l'app. e il codice per la gestione di questo smettere di comando è

private void shutdown() 
{ 
    closeAllConnection(); 
    cleanup(); 
    System.out.println("Thank you for using the tool, have a nice day!"); 
    System.exit(0); 
} 

Quando eseguo findbug contro il mio codice, un bug DM_EXIT è sollevata

Bug: new myProgram.messagingTools.main(String[]) invokes System.exit(...), which shuts down the entire virtual machine 
Pattern id: DM_EXIT, type: Dm, category: BAD_PRACTICE 


Invoking System.exit shuts down the entire Java virtual machine. This should only been done when it is appropriate. Such calls make it hard or impossible for your code to be invoked by other code. Consider throwing a RuntimeException instead. 

e si lamenta che System.exit non deve essere utilizzato per spegnere il programma.

Chiunque ha suggerimenti su come dovrei "Arrestare l'applicazione quando il mio programma riceve il comando 'quit'"?

risposta

10

Stai bene. L'avviso dice: "Questo dovrebbe stato fatto solo quando è opportuno" (sottolineatura mia)

Questo è un modo appropriato utilizzare System.exit in modo da poter ignorare l'avviso.

In alternativa, se l'intero programma viene eseguito da main senza generare nuovi thread, è possibile tornare da main e lasciare che il programma si chiuda da solo. Se hai nuovi thread (specialmente se stai usando Swing), probabilmente stai meglio usando solo System.exit ... a meno che quei thread anche debbano fare un po 'di pulizia, nel qual caso avrai bisogno di un modo per chiudili tutti con grazia.

+0

se si posiziona la chiamata System.exit (0) alla fine del metodo principale, quindi findbugs non si lamenta. FindBugs sta solo dicendo che le chiamate System.exit non dovrebbero trovarsi in vari punti del tuo codice. – Mack

0

Se si accettano (in attesa di) comandi in un ciclo, è sufficiente interrompere il ciclo ogni volta che l'utente immette esci. Potrebbe essere la condizione del tuo ciclo while ... qualcosa come while(!command.equalsIgnoreCase("quit")) { } Chiama shutdown() dopo aver chiuso il ciclo.

1

System.exit() viene utilizzato per l'uscita improvvisa. Sebbene invochi eventuali hook di arresto, non consente ai thread senza uno di terminare correttamente. L'invocazione di questo metodo è normalmente per "exit error catastrofhic".

http://www.javapractices.com/topic/TopicAction.do?Id=86

Pertanto, come suggerisce Sudhanshu modo corretto sarebbe quello di inviare un segnale al passante interprete di rompere se l'ingresso è 'smettere'. Oltre a questo il tuo codice dovrebbe tracciare tutti i thread e le risorse in modo tale che la loro pulizia sia possibile dopo aver chiuso.

0

Utilizzare invece Runtime.getRuntime().exit(0). Questo ha funzionato per me. In ogni caso alla fine System.exit(0) chiamerà questo.

Problemi correlati