Каков подходящий способ программного выхода из приложения? - PullRequest
0 голосов
/ 15 ноября 2009

Я оцениваю вводимые пользователем данные как команды для моего приложения. Если пользователь нажимает Q или q , а затем нажимает Enter, приложение закрывается и выполнение прекращается.

Есть ли надлежащий контекст или лучшие практики, как это сделать? У меня нет ресурсов для релиза или чего-то в этом роде. Должен ли я просто использовать System.exit(0);? Есть ли рекомендуемый способ сделать это?

В качестве первого подхода я делаю что-то вроде этого:

while (true){
    try{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //Other logic goes here...
        if (br.readLine().equalsIgnoreCase("Q")){
            System.exit(0);
        }
    }
    catch (IOException ioe) {
        System.out.println("IO error trying to read your selection");
    }
}

Ответы [ 6 ]

4 голосов
/ 15 ноября 2009

Вы можете также вернуться до main() и вернуться оттуда.

    private void loop() {
        while (true){
           try{
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

               //other logic goes here...
               if(br.readLine().equalsIgnoreCase("Q")){
                   return; // You're done and you are returning to the caller.
               }
           }
           catch (IOException ioe) {
               System.out.println("IO error trying to read your selection");
           }
        }
    }

    public static void main(String[] args) {
        loop();
    }

Но если вам нечего выпустить, System.exit(0) хорошо.

2 голосов
/ 15 ноября 2009

Ресурсы автоматически очищаются ОС при выходе из процесса. Есть две основные причины не просто выходить из () из середины кода (это относится ко всем языкам).

  • Могут быть некоторые действия, которые необходимо предпринять до окончания программы. Например, вам может потребоваться сохранить любые открытые файлы (т.е. записать изменения, которые по производительности или по другим причинам еще не были отправлены в файл).

  • Кто-то может захотеть позже использовать ваш код для других целей.

Взять, к примеру, систему контроля версий Git. Есть несколько попыток превратить код в библиотеку вместо набора автономных исполняемых файлов, чтобы его можно было эффективно включить в другие проекты. Одна из проблем (из того, что я слышал) заключается в том, что код иногда просто завершается вместо отслеживания и очистки ресурсов, которые он использует. Как исполняемый файл это хорошо, но если он был импортирован как библиотека, вы не всегда хотите просто завершить хост-приложение, потому что вы закончили свою маленькую часть.

1 голос
/ 15 ноября 2009

Возвращение обратно к Возвращение из main(), конечно, самый чистый способ, но если это нелегко сделать, System.exit() вполне подойдет.

Это не имеет прямого отношения к вашему вопросу, но выбрасывание (необработанного) исключения, как правило, является способом завершения для фатального состояния , поскольку оно предоставляет много информации для отслеживания бедному пользователю. *

0 голосов
/ 15 ноября 2009

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

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

Просто что-то иметь в виду, re. код повторного использования.

0 голосов
/ 15 ноября 2009

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

Однако вам нужно использовать выход только в том случае, если у вас есть скрипт, которому нужна информация об аварийном завершении. В противном случае в этом нет необходимости.

Насколько я помню, Java-программа по умолчанию завершает работу с 0, что означает нормальное завершение. Поэтому вы хотите использовать System.exit (n) для случаев, когда ваша программа завершает работу из-за какой-либо ошибки.

Пример (просто используя статические методы, которые вы, скорее всего, захотите создать ...):

public static void main(String[] args) {
   try {
     doStuff();
   } catch (SomeRuntimeException e) {
     // marching orders! Exit with errorcode
     <log the error with sufficient info for debugging>
     System.exit(1);
   }
}

private static doStuff() {
  // doing my thing ...
  ...
  //then some error occurs and I have no other choice but to do a hard exit
  throw new SomeRuntimeException(  ... some info would be nice ...)
  ...
  return
}
0 голосов
/ 15 ноября 2009

Я бы хотел сказать:

Это не имеет значения, это полностью зависит от вы!

И тест это иногда правда, в других случаях это зависит от структуры программы и целостности кода.

Разумный выход будет через метод main, завершающий все потоки.

System.exit принудительно завершает все потоки в JVM. System.exit никогда не возвращается нормально. Следует использовать для ошибки.

...