Я ищу альтернативу этой бесконечной петле - PullRequest
1 голос
/ 26 июня 2019

Я использую цикл while (true) для приведенного ниже кода, но мы остановились от его использования.Я не могу придумать другой способ сделать это.

Я пытался использовать цикл do-while, но это не помогает моей ситуации здесь.

'' 'java

while(true){
            System.out.println("\nSelect the number of the Option you wish to carry out:\n    1) Enter Scores\n    2) Find Golfer\n    3) Display Scoreboard\n    4) Edit Scoresheet\n    5) Exit\n ");
            userChoice = integerVerify(); //Used to verify whether user input is a valid number
            switch (userChoice) {

                case 1:
                    System.out.println("Please enter the scores in the following order");
                    displayPlayers();   //Displays scoreboard to help users enter player scores in order.
                    addScores();    //Used to verify whether user input is a valid String
                    break;

                case 2:
                    System.out.println("**********PLEASE ENTER THE NAME OF THE PLAYER YOU WISH TO FIND**********");
                    findPlayer();
                    break;

                case 3:
                    displayPlayers();
                    break;

                case 4:
                    options();
                    break;

                case 5:
                    System.out.println("Are you sure you wish to exit?");
                    confirm = stringVerify();
                    if (confirm.equalsIgnoreCase("yes") || confirm.equalsIgnoreCase("y")) {
                        System.out.println("Thank you for using our application.");
                        System.out.println("Exiting");
                        System.exit(0);
                    }
                    break;

                default:
                    System.out.println("Please enter an appropriate option.");
            }
        }

' ''

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

1 Ответ

3 голосов
/ 26 июня 2019

Большинство систем с длительным сроком действия имеют какой-то цикл "Бесконечный" верхнего уровня.Я не вижу большой проблемы с этим, но политически некоторым людям не нравятся бесконечные циклы.

Если это ваша проблема, инициализируйте логический флаг «выполняется» как true, используйте while (running) и вместо этогодля System.exit () установлен на false.Должен быть такой же эффект.

public static void main(String[] s)
{
    Boolean running=true;
    while(running) {        
         switch() {
         ...
             case 5:
               ...
                if(exitConditionsMet) 
                    running=false;
          …
          }         
     }
     return; // Just let main return to exit program.
 }

Технически нет никакой реальной разницы, но некоторые люди были обучены сканировать это в то время как (истинно) конструкцию и называть это проблемой.

Есть пара НЕМЕДЛЕННЫХ преимуществПодход флага ...

  • Поток управления при выходе из функции является неожиданным.Если бы вы сканировали этот код на очень высоком уровне, просто ища управление потоком (фигурные скобки и конструкции типа if / while / for / break), вы бы сразу не увидели, что этот цикл когда-нибудь завершится.
  • Некоторыеинструменты статического анализа могут быть слегка запутаны по той же причине.
  • System.exit, как правило, следует избегать (по привычке, а не в данном случае специально).System.exit может принудительно неестественно завершать работу контейнеров (таких как Tomcat), он также может уничтожать потоки, которые могут быть в процессе выполнения чего-то важного (за исключением случаев, когда вам нужно вернуть значение в командную строку, что означает, что вам нужна система.exit (), но, возможно, вы захотите сделать его последней строкой вашего основного.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...