使用While循环将键盘的用户输入与字符串进行比较

时间:2014-06-29 10:29:40

标签: java string input comparison

我在尝试让我的程序检测到用户输入Y表示是,N表示否编号时遇到问题。

这是代码......

import java.util.Scanner;

public class Examulator {
    public static void main (String [] args){

        System.out.println("How Many Marks Was Your Practicals Out Of?");
        Scanner scan = new Scanner (System.in);
        int practicalsOutOf = scan.nextInt();

        System.out.println("Okay And What Did You Get Out Of:" + "  " + practicalsOutOf);
        Scanner scan2 = new Scanner (System.in);
        int whatYouGotInPracticals = scan.nextInt();

        System.out.println("Okay so you got" + "  " + whatYouGotInPracticals + "/" + practicalsOutOf + "  " + "For Your Practicals Correct?");
        scan.nextLine();


        String answer = scan.nextLine();
        while ( !"Y".equals(answer) || !"N".equals(answer)){
            System.out.println("Please Type A Capital Y If Correct Or A Capital N If Incorrect");
            scan.nextLine();
        }
        System.out.println("Thank You");


    }
}

当我输入Y或N时,它没有将其识别为正确的答案,程序继续通过外观显示:

请输入大写Y(如果正确)或大写N(如果不正确

所以它没有退出循环?

如果我摆脱OR比较并保持它以便程序只寻找 Y 我可以让程序退出循环如果我输入正确答案第一次否则它会忽略正确的答案并继续循环。

当我重新进行OR比较以便程序可以接受Y或N时,即使我第一次输入正确的答案,它也不会接受任何一个并继续运行循环。

我真的无法看到我在这里做错了什么。任何帮助都会很棒!

由于

3 个答案:

答案 0 :(得分:1)

您的while条件不佳:

!"Y".equals(answer) || !"N".equals(answer)

意味着:

如果answer "Y" answer "N"你会继续。

由于answer永远不会同时(满足这个条件的唯一方法),这将永远是真的。

只需将||更改为&&

是的,没有必要创建另一个相同的扫描仪。

修改: 为什么&&有效:

!"Y".equals(answer) && !"N".equals(answer)

表示如果answer不是"Y" answer不是"N",则意味着用户给了我们一些既不是{{ 1}}也不是"Y",在我们的案例中输入错误,我们应该让他再试一次。

请注意,当{且仅当"N"answer"Y"时,此条件为false,这正是我们想要的。

修改

另一个问题是由于您从未在循环中分配"N"(因此它将永远具有初始值 muhahaha :)),请参阅下面的演示。

这:answer只扫描并忽略返回值:scan.nextLine();没有。

DEMO. DEMO2

答案 1 :(得分:0)

试试;

String answer = scan.nextLine();
while ( !"Y".equals(answer) && !"N".equals(answer)){
    System.out.println("Please Type A Capital Y If Correct Or A Capital N If Incorrect");
    answer = scan.nextLine(); //here set the next scan to answer
}

答案 2 :(得分:0)

你没有在循环中设置答案,你只在循环之前设置一次(这就是为什么它只在第一次起作用):

变化

scan.nextLine();

answer = scan.nextLine();