循环'忽略'输入?

时间:2011-11-01 03:00:09

标签: java while-loop

好的,这是我的代码:

public static void playAgain(Scanner in){
    System.out.print("Play again?: ");
    String again=in.next();
    if (again.equalsIgnoreCase("y")){
        playerScore=0;
        aiScore=0;
        playAgain=true;
        }
    else if (again.equalsIgnoreCase("n")){
        playAgain=false;
        }
    else {
        while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
            again=in.next();
            }
        }
    }

出于某种原因,如果我输入了错误的变量,比如说'boog',那么while循环会打印一条错误信息但是由于某种原因,即使我输入'n'也默认为'y' - 例如,一个样本运行会是:

再玩一次?的布格

输入无效,请输入y或n。 名词

尽管输入了n -

- 程序仍会再次播放

我该如何解决这个问题?这是订单的问题吗?提前谢谢!

5 个答案:

答案 0 :(得分:4)

我猜你正在使用一些全局变量playAgain来指示是否再次播放。我会从函数中返回boolean,但无论如何,我都没有在最后playAgain块中看到else被修改:

 else {
        while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
            again=in.next();
            }
        }

也许你想要if循环中的while整套,所以again在包含“y”或“n”之后会被处理?无论哪种方式,功能的结构都需要重新思考。

编辑:我的方法将是:

public static boolean playAgain(Scanner in){
   System.out.print("Play again?: ");
   String again=in.next();

   while (!again.equalsIgnoreCase("y") && !again.equalsIgnoreCase("n")) {
      System.out.print("Invalid response.  Please enter \"y\" or \"n\": ");
      again = in.next();
   }

   if (again.equalsIgnoreCase("y")){
      playerScore = 0;
      aiScore = 0;
      return true;
   }

   // there are only two valid options, so to get here it must be "n"
   return false;
}

答案 1 :(得分:3)

在最后的else分支中,在您从while循环获得有效输入后,您没有设置playAgain变量,因此它保留了它具有的值 - 是的这个案例。您必须根据输入进行设置。

答案 2 :(得分:3)

可能是因为您在退出while循环后没有将playAgain设置为false。前一个值是playAgain true吗?

我认为你需要考虑重构,以便while循环高于'y'和'n'if / else语句。这样,一旦用户输入了有效值,就会始终调用if / else。验证应该在方法的开头。

答案 3 :(得分:0)

我可以看到,你的程序存在缺陷。

  1. if-else应该在另一个while循环中(例如在again ==n的情况下为无限循环或退出)。这样每次进入scanner.next()元素时,都会再次执行play逻辑。
  2. while循环在这里执行代码并且工作正常,因为你没有收到警告“输入无效,请输入y或n”。试。
  3. 因此again的值为“n”,因此你的while循环退出逻辑。因此请检查playAgain是否设置为 true

答案 4 :(得分:0)

流量不好。 你应该做这样的事情(抱歉任何错误,这是在我的手机上精心打字的:

public static void playAgain(Scanner in){
   System.out.print("Play again?: ");
      while (true) {
         String again=in.next();
         if (again.equalsIgnoreCase("y")){
            playerScore=0;
            aiScore=0;
            playAgain=true;
                break; 
         } else if (again.equalsIgnoreCase("n")){
            playAgain=false;
            break;
         } else {
            // bad input, so allow to loop again
            System.out.print("Invalid input! Please enter y or n");
         } 
      }
}