验证输入时无限循环

时间:2016-02-17 23:56:49

标签: java

我遇到输入验证问题。我写了一个程序,其中两个人正在模拟骰子游戏。实际的游戏代码没问题,但是当我试图再次运行程序时,我只是不知道为什么我会有无限循环。基本上,如果用户输入" Y"程序将再次运行,如果他们输入" N",程序将结束,如果他们输入除Y或N以外的任何内容,则提示,"您想再次玩吗?" ;以下代码是正确的还是我需要更改一下(我主要是指输入验证代码)?

do{
        System.out.print("Would you like to play again? (Y/N): ");
        String command = input.next();
        if(input.hasNextLine()){
            if(command.equals("Y") || command.equals("y")){
                die1 = rand.nextInt(6) + 1;
                die2 = rand.nextInt(6) + 1;
                die3 = rand.nextInt(6) + 1;
                die4 = rand.nextInt(6) + 1;
                sum = die1 + die2;
                sum2 = die3 + die4;

                System.out.printf("%s rolled a %d and %d for a total of %d. %n", name1, die1, die2, sum);
                System.out.printf("%s rolled a %d and %d for a total of %d. %n", name2, die3, die4, sum2);

                if(sum > sum2){
                    System.out.println(name1 + " " + "won!");
                }
                else if (sum2 > sum){
                    System.out.println(name2 + " " + "won!");
                }
                else if (sum == sum2){
                    System.out.println(name1 + " " + "and" + " " + name2 + " " + "tied!");
                }

                game = input.nextLine();
        }
        else if(command.equals("N") || command.equals("n")){
            System.exit(1);
        }
        }
    }while(!validInput);
}

}

编辑:我删除了整个代码,只是插入了一些有问题的代码,但这是正确的......再次感谢!

2 个答案:

答案 0 :(得分:0)

inputScanner个对象,永远不会等于YESYES2String个对象。您需要使用nextLine来阅读下一个String并将该值保存到response等变量中。然后,您可以将responseYES和其他字符串进行比较。

    do {
        System.out.print("Would you like to play again? (Y/N): ");
        String response = input.nextLine();
        if (response.equalsIgnoreCase(YES)) {
            die1 = rand.nextInt(6) + 1;
            die2 = rand.nextInt(6) + 1;
            die3 = rand.nextInt(6) + 1;
            die4 = rand.nextInt(6) + 1;
            sum = die1 + die2;
            sum2 = die3 + die4;

            System.out.printf("%s rolled a %d and %d for a total of %d. %n", name1, die1, die2, sum);
            System.out.printf("%s rolled a %d and %d for a total of %d. %n", name2, die3, die4, sum2);
            game = input.nextLine();
            break;
        } else if (response.equalsIgnoreCase(NO)) {
            System.exit(1);
        }
    } while (validInput);

答案 1 :(得分:0)

如果你想通过System.exit()终止程序,你可以用一个while(true)循环来包围你的程序,你不必非常喜欢do-while循环。此处也不需要hasNextLine。您可以使用equalsIgnoreCase(" y")缩短输入验证。在循环之外声明变量通常也是个好主意。 (即。字符串命令;在外部,命令="东西"在内部)。我不确定它在这种特殊情况下是如何工作的,但很多时候你会在尝试重新声明变量时遇到错误。

虽然我看到你的循环问题是你没有其他条款来处理输入,如果用户输入的内容不是" Y"或" N"。如果输入了这个其他输入,你可以在结束时使用else子句终止程序,或者你可以简单地使用continue;声明开始重新编程。