我的扫描仪收集的输入未正确处理

时间:2016-09-30 20:59:32

标签: java java.util.scanner do-while

作为一个自我指定的练习,我正在尝试编写一个生日的简单程序,并确定给定日期所在的星期几。该计划的第一部分决定了这一年。我正在使用扫描仪收集用户输入,然后使用do-while循环来测试输入是否可用(必须是数字,必须有四位数),如果输入不符合标准,则重复。我试图进入1998年,这显然是一个数字和四位数,它重复循环,好像我的输入无效。我认为在我的do-while循环中某处存在问题,但我无法确定它是什么。这是有问题的代码。

public static boolean isInteger(String input)
{
   try
   {
      Integer.parseInt(input);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}
public static void main(String[] args)
{
    String year = "";
    String yearcorrect = "";
    int ylength = year.length();
    boolean yearIsYear = true;
    Scanner scan = new Scanner(System.in);

    do 
    {
        System.out.println("Please enter the year of your birth.");
        year = scan.nextLine();
        boolean yearIsNum = isInteger(year);

        if (yearIsNum = false || ylength != 3)
        {
            System.out.println("Input is not a valid year.");
            yearIsYear = false;
        }
        else 
        {
            System.out.println("You entered the year " + year + ". Is this correct?");
            yearIsYear = true;
            yearcorrect = System.console().readLine();
        }
    }
    while (yearcorrect != "yes" && yearIsYear != true);

1 个答案:

答案 0 :(得分:0)

第一个错误:

    if (yearIsNum = false || ylength != 3)

应该是

    if (yearIsNum = false || ylength != 4)

第二个错误:

正如@ChiefTwoPencils所指出的,yearIsNum = false会将false分配给yearIsNum,条件永远不会通过。通常java保护我们免受所有类型的错误,除了...布尔。为了避免将来出现此类错误(并使代码更具可读性),您只需使用!yearIsNum代替yearIsNum == false或反转值的顺序 - >把常数放在第一位:false == yearIsNum - >这样,如果你错过=,那么编译器会给你一个错误。我个人更喜欢!yearIsNum,因为它更短,更易读。

第三个错误

您错误地比较字符串。您必须使用str1.equals(str2)。对==使用对象(和字符串是对象)比较它们的引用,而不是它们的值。

例如"a" == new String("a")将等于false