循环直到达到有效输入

时间:2014-02-09 14:22:40

标签: java while-loop

第一次正确执行,但是:

  1. 继续打印“请再试一次(是/否)?”无论如何 在要求继续之后输入。
  2. 我不确定!=是否适合用于字符串比较。我想说 loopChoice“不是”Y或N,继续问。

    while(isLoop) {
        // Ask for user input
        System.out.print("Enter hours worked: ");
        hoursWorked = scn.nextInt();
    
        System.out.print("Enter rate per hour: ");
        payRate = scn.nextInt();
        scn.nextLine();
    
        // Call functions to compute stuff
        ...
    
        // Print results
        ...
    
        System.out.print("\nDo you want to continue (Y/N)? ");
        loopChoice = scn.nextLine().toUpperCase();
    
        while(loopChoice != "Y" || loopChoice != "N") {
            System.out.print("\nPlease try again (Y/N)? ");
            loopChoice = scn.nextLine().toUpperCase();
        }
    
        switch(loopChoice) {
            case "Y":
                isLoop = true;
                System.out.print("\n");
                break;
    
            case "N":
                isLoop = false;
                System.out.println("Terminating program...");
                scn.close();
                System.exit(0);
                break;
    
            default:
                System.out.println("Your input is invalid!");
                isLoop = false;
                System.out.println("Terminating program...");
                scn.close();
                System.exit(0);
                break;
        }
    }
    

5 个答案:

答案 0 :(得分:2)

您应该与String equals

进行比较
while (!loopChoice.equals("Y") && !loopChoice.equals("N"))

另外,用和运算符

替换或运算符

答案 1 :(得分:1)

这不是你如何比较Java中的字符串。

您的代码中也存在逻辑错误,因为字符串不能同时为Y和N,您必须使用&&而不是||。只要选择既不是Y也不是N,您希望继续循环。如果是其中任何一个,你想停下来。所以&&是正确的选择。

要检查两个字符串是否相等,您必须使用.equals(obj)

while (!loopChoice.equals("Y") && !loopChoice.equals("N")) {

原因是==比较对象引用,两个字符串通常不是同一个对象引用。 (从技术上讲,它们可以是相同的对象引用,但现在不需要担心)为安全起见,请使用.equals来比较字符串。

要避免在其他情况下可能NullPointerException,您还可以使用:

while (!"Y".equals(loopChoice) && !"N".equals(loopChoice)) {

答案 2 :(得分:1)

您不能使用loopChoice != "Y",因为“Y”是一个字符串。使用:

  • loopChoice != 'Y'
  • "Y".equals(loopChoice)

或者,使用"Y".equalsIgnoreCase(loopChoice)

如果您使用Java 1.6或更早版本,则无法对字符串进行大小写切换。小心。

答案 3 :(得分:1)

如果其中一个条件是 true ,您需要知道OR操作将返回 true ,所以如果您输入Y,则逻辑上,so you ask if the input is not equal Y所以答案是 false ,那么你将转到条件if the input not equal N的下一部分,所以答案是 True ,所以你的最终结果将是( True || False = True),然后你会再次进入while循环

所以真实条件是(输入不等于Y&& not equal N

答案 4 :(得分:1)

在检查对象的平等与对象的值之间,你已经陷入了共同的早期差距。 (您可以看到字符串比较信息的快速列表[此处] (http://docs.oracle.com/javase/tutorial/java/data/comparestrings.html

您所写的内容询问对象 loopChoice 是否与字符串常量“Y”相同,或者字符串常量“N”是否始终返回false。您想询问对象loopChoice的值是否与字符串常量“Y”的值相同。

您可以按如下方式重写代码:

System.out.print("\nDo you want to continue (Y/N)? ");
// get value of next line, and trim whitespace in case use hit the spacebar
loopChoice = scn.nextLine().trim();


while (!("Y".equalsIgnoreCase(loopChoice) || "N".equalsIgnoreCase(loopChoice)) {
    System.out.print("\nPlease try again (Y/N)? ");
    loopChoice = scn.nextLine().toUpperCase();
}

注意,为了清晰起见,我想先将常数值放在第一位。确定两个字符串的值是否相同的一般形式是String1.equalsIgnoreCase(String2)。