2013-03-19 1 views
5

У меня есть интерактивная Java-программа, которая позволяет пользователю отправлять сообщения на сервер, который ведет себя как оболочка, принимает ввод клавиатуры пользователя и выполняет различные действия.Как правильно закрыть программу командной строки java

Например

myProgram> send "Login as James" to server 

Моя программа будет анализировать ввод пользователя и выполнить действие, в данном случае, он будет посылать сообщение «Войти, как Джеймс» на сервер.

Одна из команд, которые я поддерживаю в своем «завершении», который закроет все подключения к серверу, очистит ресурсы и выключит приложение. и код для обработки этого выхода команда

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

Когда я бегу findbug против моего кода, DM_EXIT ошибка возникает

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. 

и жалуется, что System.exit не следует использовать для завершения работы в программа.

У кого-нибудь есть предложение о том, как я должен «Завершить приложение, когда моя программа получит команду« quit »?

ответ

10

Все в порядке. Предупреждение говорит: «Это должно только было сделано , когда это уместно» (курсив мой)

Это подходящий способ использовать System.exit так что вы можете проигнорировать предупреждение.

В качестве альтернативы, если вся ваша программа запущена от main без появления новых тем, то вы можете просто вернуться с main и позволить программе отключиться самостоятельно. Если у вас есть какие-либо новые потоки (особенно если вы используете Swing), вам, вероятно, лучше всего использовать System.exit ... если эти потоки тоже не нуждаются в очистке, и в этом случае вам понадобится способ все они изящно закрывают.

+0

Если вы поместите вызов System.exit (0) в конце основного метода, то findbugs не жалуются на него. FindBugs просто говорит, что вызовы System.exit не должны быть в разных местах вашего кода. – Mack

0

Если вы принимаете (ждут) команды в цикле, просто выходите из цикла всякий раз, когда пользователь вводит , выходите из. Это может быть условием вашего цикла while ... что-то вроде while(!command.equalsIgnoreCase("quit")) { } Вызовите shutdown() после выхода из цикла.

1

System.exit() используется для крутого выхода. Несмотря на то, что он вызывает любые зависания при завершении работы, он не позволяет потокам без единого завершения. Вызов этого метода обычно выполняется для «катастрофического выхода ошибки».

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

Поэтому, как Sudhanshu предполагает правильный путь будет послать сигнал на петлю интерпретатора, чтобы сломаться, если вход «бросить курить». Помимо этого, ваш код должен отслеживать все потоки и ресурсы, чтобы их очистка была возможна после выхода.

0

Использовать вместо Runtime.getRuntime().exit(0). Это сработало для меня. В любом случае, в конечном итоге System.exit(0) собирается это назвать.