2013-03-19 8 views
5

Ich habe ein interaktives Java-Programm, mit dem Benutzer Nachrichten an einen Server senden können, der sich wie eine Shell verhält, die Tastatureingaben akzeptiert und verschiedene Aktionen ausführt.Wie man ein Java-Befehlszeilenprogramm ordnungsgemäß herunterfährt

Zum Beispiel

myProgram> send "Login as James" to server 

Mein Programm wird die Benutzereingabe analysieren und die Aktion, in diesem Fall durchführt, wird die Meldung „Login als James“ an den Server senden.

Einer der Befehle, die ich unterstütze seine "quit", die alle Server-Verbindung schließen wird, Ressourcen bereinigen und die App herunterfahren. und der Code für diese Behandlung beenden Befehl

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

ist, wenn ich findbug gegen meinen Code ausführen, wird ein DM_EXIT Fehler wird

angehoben
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. 

und beschwert sich, dass System.exit sollte nicht zur Abschaltung verwendet werden, die Programm.

Jeder hat einen Vorschlag, wie soll ich "die Anwendung herunterfahren, wenn mein Programm den Befehl 'quit' erhält"?

Antwort

10

Es geht Ihnen gut. Die Warnung sagt: „Dies sollte nur geschehen, wenn es angebracht ist“ (Hervorhebung von mir)

Dies ist ein geeigneter Weg System.exit zu verwenden, so können Sie die Warnung ignorieren.

Alternativ, wenn Ihr gesamtes Programm von main ausgeführt wird, ohne neue Threads zu erstellen, können Sie einfach von main zurückkehren und das Programm von selbst herunterfahren lassen. Wenn Sie neue Threads haben (besonders wenn Sie Swing verwenden), dann sind Sie wahrscheinlich besser dran, wenn Sie nur System.exit ... verwenden, es sei denn, diese Threads auch müssen etwas aufräumen, in diesem Fall müssen Sie einen Weg zu schließ sie alle anmutig.

+0

Wenn Sie den System.exit (0) -Aufruf am Ende der Hauptmethode platzieren, dann reklamiert findbugs nicht. FindBugs sagt nur, dass die System.exit-Aufrufe nicht an verschiedenen Stellen in Ihrem Code sein sollten. – Mack

0

Wenn Sie Befehle in einer Schleife akzeptieren (warten), brechen Sie die Schleife nur dann ab, wenn der Benutzer quit eingibt. Das könnte die Bedingung Ihrer while-Schleife sein ... etwas wie while(!command.equalsIgnoreCase("quit")) { } Rufen Sie shutdown() nach dem Verlassen der Schleife.

1

System.exit() wird für abrupten Ausgang verwendet. Obwohl es alle Shutdown-Hooks aufruft, lässt es die Threads nicht zu, dass sie ordnungsgemäß beendet werden. Aufruf dieser Methode ist normalerweise für "katastrophaler Fehler Ausgang".

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

daher als Sudhanshu richtige Art und Weise schlägt vor, wäre ein Signal an Ihre Dolmetscher Schleife senden zu brechen, wenn Eingang ‚verlassen‘. Außerdem sollte Ihr Code alle Threads und Ressourcen verfolgen, so dass deren Bereinigung nach dem Beenden möglich ist.

0

Verwenden Sie stattdessen Runtime.getRuntime().exit(0). Das hat für mich funktioniert. Wie auch immer, irgendwann wird System.exit(0) dies nennen.