2009-11-15 3 views
0

Я оцениваю пользовательские входы как команды для моего приложения. Если пользователь нажимает 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"); 
    } 
} 
+4

Нет ничего плохого в 'System.exit (0);'. Но я думаю, что у вас есть более важные вещи, о которых нужно беспокоиться, например, правильно отпечатать ваш код. – Artelius

+0

Извините, я копирую/вставляю в спешке – denchr

ответ

4

Вы могли бы также вернуться к 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) прекрасно.

+0

Да, System.exit (0) отлично подходит для того, что вы описали. Предложение Дмитрия вернуться к main() - хорошая идея, однако, если вы расширите программу в будущем и откроете материал, который нужно освободить. – Jeff

0

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

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

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

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

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

1

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

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

+0

Код в моем примере находится внутри основного. Я думаю, есть некоторые проблемы с пониманием значения «Возвращение на обратном пути к main()». Извините, поэтому я попросил пример в предыдущем ответе. – denchr

+0

Извините. Помимо использования 'System.exit()', поток * из * 'main()' является самым чистым способом. –

2

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

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

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

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

0

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

Однако вам нужно всего лишь использовать 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

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

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

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