【问题标题】:I'm looking for an alternative to this Infinite Loop我正在寻找这个无限循环的替代品
【发布时间】:2019-06-26 16:24:40
【问题描述】:

我正在为以下代码使用 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.");
            }
        }

'''

代码需要拒绝任何不在 switch-case 中的东西......但它还需要显示适当的消息,无论是通过函数还是来自循环本身,最终,我仍然需要它循环直到退出选项(案例5)被输入。

【问题讨论】:

  • 为什么不允许while(true)?这看起来像是使用它的有效场景。如果只是不允许while的情况,您可以使用for(;;)
  • 这是一个作业。他们试图让我们使用更合适的方式来执行循环。但我可能会坚持下去,因为这似乎是更合适的做法
  • 我不确定如何在这里进行递归。这种应用程序中的顶级控制循环很常见,您所做的非常好。如果您想获得老师的额外学分,您可以将数字替换为数字常量,如“case DISPLAY:”和“case EXIT:”以提高可读性。
  • 您可以将菜单设为一个函数并在 main 方法中调用一次,在默认情况下调用一次,然后在切换后再次调用。在手动关闭程序之前,这应该是不可避免的。

标签: java switch-statement infinite-loop


【解决方案1】:

大多数长时间运行的系统都有某种顶级“无限”循环。我认为这没有什么大问题,但在政治上有些人不喜欢无限循环。

如果这是您的问题,请将布尔“运行”标志初始化为 true,使用 while(running) 而不是 System.exit() 将 running 设置为 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.
 }

从技术上讲并没有真正的区别,但有些人已经接受过培训,可以扫描那个 while(true) 构造并将其称为问题。

标志方法有几个轻微的优势......

  • 通过函数退出的控制流出现意外。如果您在非常高的级别上扫描该代码只是为了寻找流控制(大括号和 if/while/for/break 类型的构造),您不会立即看到该循环会退出。
  • 出于同样的原因,一些静态分析工具可能会有些混乱。
  • 通常应避免使用 System.exit(作为习惯问题,在这种情况下不具体)。 System.exit 可以强制容器(如 Tomcat)不自然地关闭,它还可以杀死可能正在执行重要操作的线程(除非您需要向命令行返回值,这意味着您需要一个系统。 exit() 但可能想让它成为 main 的最后一行。

【讨论】:

  • 感谢您的帮助比尔。但我在想,使用递归函数怎么样?这不会解决循环的整个问题吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2015-06-21
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多