在Java中,没有明显的原因跳过代码行

在Java中,没有明显的原因跳过代码行,java,string,input,character,Java,String,Input,Character,我正在做Y.Daniel Liang的《Java编程入门》一书中的一个练习。在这个程序中,用户可以看到一个月内有不同日期的表格。如果用户的生日在显示的表格中,则用户提示“Y”表示是,提示“N”表示否。根据用户提示“Y”的次数,程序应猜测用户的生日是当月的哪一天。当我运行程序并显示第一组日期时,我输入“Y”或“N”。然后set2和set3被打印出来,但是我没有输入任何内容。打印第4组时,我可以再次键入输入,但打印第5组后,无法键入输入。为什么我只能在set1和SET4之后输入?代码如下所示: im

我正在做Y.Daniel Liang的《Java编程入门》一书中的一个练习。在这个程序中,用户可以看到一个月内有不同日期的表格。如果用户的生日在显示的表格中,则用户提示“Y”表示是,提示“N”表示否。根据用户提示“Y”的次数,程序应猜测用户的生日是当月的哪一天。当我运行程序并显示第一组日期时,我输入“Y”或“N”。然后set2和set3被打印出来,但是我没有输入任何内容。打印第4组时,我可以再次键入输入,但打印第5组后,无法键入输入。为什么我只能在set1和SET4之后输入?代码如下所示:

import java.util.Scanner;


public class GuessBirthday {

public static void main(String[] args)
        throws java.io.IOException {

String set1 = 
    "  1  3  5  7\n" +
    "  9 11 13 15\n" +
    " 17 19 21 23\n" + 
    " 25 27 29 31";

    String set2 = 
    "  2  3  6  7\n" +
    " 10 11 14 15\n" +
    " 18 19 22 23\n" + 
    " 26 27 30 31";

    String set3 = 
    "  4  5  6  7\n" +
    " 12 13 14 15\n" +
    " 20 21 22 23\n" + 
    " 28 29 30 31";

    String set4 = 
    "  8  9 10 11\n" +
    " 12 13 14 15\n" +
    " 24 25 26 27\n" + 
    " 28 29 30 31";

    String set5 = 
    " 16 17 18 19\n" +
    " 20 21 22 23\n" +
    " 24 25 26 27\n" + 
    " 28 29 30 31";

    int day = 0;

    // Create a scanner

    Scanner input = new Scanner(System.in);

    // Prompt the user to answer questions

    System.out.print("Is your birthday in set1?\n");
    System.out.print(set1);
    System.out.print("\nEnter (Y) for yes or (N) for no: ");
    char answer = (char) System.in.read();

    if (answer == 'Y')
        day += 1;

    System.out.print("\nIs your birthday in set2?\n");
    System.out.print(set2);
    System.out.print("\nEnter (Y) for yes or (N) for no: ");
    answer = (char) System.in.read();

    if (answer == 'Y')
        day += 2;

    System.out.print("\nIs your birthday in set3?\n");
    System.out.print(set3);
    System.out.print("\nEnter (Y) for yes or (N) for no: ");
    answer = (char) System.in.read();

    if (answer == 'Y')
        day += 4;

    System.out.print("\nIs your birthday in set4?\n");
    System.out.print(set4);
    System.out.print("\nEnter (Y) for yes or (N) for no: ");
    answer = (char) System.in.read();

    if (answer == 'Y')
        day += 8;

    System.out.print("\nIs your birthday in set5?\n");
    System.out.print(set5);
    System.out.print("\nEnter (Y) for yes or (N) for no: ");
    answer = (char) System.in.read();

    if (answer == 'Y')
        day += 16;

    System.out.println("\nYour birthday is " + day + "!");

    }
}

调用System.in.read()

时,您从来不会实际吞食换行符,因为您使用的是
System.in.read()
。回车符(\r)和/或换行符(\n)将计为字符。因此,在第一次输入时,例如在windows上输入了“Y\r\n”,因此System.in.read()第一次将获得“Y”,下次将收到“\r”

您可以使用您实例化的
扫描仪

String answer = input.nextLine();
if (answer.equals("Y") {
    // blah
}

我也在想同样的事情(使用0和1是很奇怪的),所以对于在这里偶然发现的任何其他人,我让它工作了(注意-你也可以用“char”来做这件事,只要用“char”替换“String”一词即可):


如果不使用,为什么要创建
扫描仪输入
?练习是重写程序,其中整数0和1用于“否”和“是”,而将字符“Y”和“N”作为输入。实际上,我忘了在使用System.in.read()时不需要它。但你的观点是正确的,谢谢你指出这一点!
import java.util.Scanner;


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

String set1 = 
"  1  3  5  7\n" +
"  9 11 13 15\n" +
" 17 19 21 23\n" + 
" 25 27 29 31";

String set2 = 
"  2  3  6  7\n" +
" 10 11 14 15\n" +
" 18 19 22 23\n" + 
" 26 27 30 31";

String set3 = 
"  4  5  6  7\n" +
" 12 13 14 15\n" +
" 20 21 22 23\n" + 
" 28 29 30 31";

String set4 = 
"  8  9 10 11\n" +
" 12 13 14 15\n" +
" 24 25 26 27\n" + 
" 28 29 30 31";

String set5 = 
" 16 17 18 19\n" +
" 20 21 22 23\n" +
" 24 25 26 27\n" + 
" 28 29 30 31";

int day = 0;

// Create a scanner

Scanner input = new Scanner(System.in);

// Prompt the user to answer questions

System.out.print("Is your birthday in set1?\n");
System.out.print(set1);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
String answer = input.next();

if (answer.equals("Y"))
    day += 1;

System.out.print("\nIs your birthday in set2?\n");
System.out.print(set2);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();

if (answer.equals("Y"))
    day += 2;

System.out.print("\nIs your birthday in set3?\n");
System.out.print(set3);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();

if (answer.equals("Y"))
    day += 4;

System.out.print("\nIs your birthday in set4?\n");
System.out.print(set4);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();

if (answer.equals("Y"))
    day += 8;

System.out.print("\nIs your birthday in set5?\n");
System.out.print(set5);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();

if (answer.equals("Y"))
    day += 16;

System.out.println("\nYour birthday is " + day + "!");

}
}