所以我早些时候实例化了Scanner scan
,但它在scan.nextLine()
之后跳过我的第二个scan.nextInt()
。我不明白为什么会跳过它?
System.out.println("Something: ");
String name = scan.nextLine();
System.out.println("Something?: ");
int number = scan.nextInt();
System.out.println("Something?: ");
String insurer = scan.nextLine();
System.out.println("Something?: ");
String another = scan.nextLine();
答案 0 :(得分:7)
因为输入数字时
int number = scan.nextInt();
你输入一些数字并点击输入,它只接受数字并在缓冲区中保留换行符号
所以nextLine()
只会看到终结符字符,它会假设它是空白字符串作为输入,要修复它,在处理scan.nextLine()
之后添加一个int
例如:
System.out.println("Something?: ");
int number = scan.nextInt();
scan.nextLine(); // <--
答案 1 :(得分:4)
当您致电int number = scan.nextInt();
时,它不会消耗已推送的回车符,所以这是在下一个scan.nextLine();
您希望代码
....
System.out.println("Something?: ");
int number = scan.nextInt();
scan.nextLine(); // add this
System.out.println("Something?: ");
String insurer = scan.nextLine();
答案 2 :(得分:4)
*方法nextInt()不会消耗新的行字符\ n。所以新的行字符是 已经存在于缓冲区中,而nextInt()将被忽略。
*接下来当你在nextInt之后调用nextLine()时,nextLine()将使用旧的新行
留下的角色考虑结束,跳过其余部分。
解决方案
int number = scan.nextInt();
// Adding nextLine just to discard the old \n character
scan.nextLine();
System.out.println("Something?: ");
String insurer = scan.nextLine();
OR
//将字符串明确地解析为interger
String name = scan.nextLine();
System.out.println("Something?: ");
String IntString = scanner.nextLine();
int number = Integer.valueOf(IntString);
System.out.println("Something?: ");
String insurer = scanner.nextLine();
答案 3 :(得分:1)
之前给出的所有答案或多或少都是正确的。
这是一个紧凑版本:
您想要做什么:首先使用nextInt()
,然后使用nextLine()
发生了什么:当nextInt()
等待您的输入时,您在键入整数后按ENTER
键。 问题是nextInt()
识别并只读取数字,因此\n
键的ENTER
会留在控制台上。
当nextLine()
再次出现时,您希望它等到找到\n
。但是你没看到的是\n
由于nextInt()
的不稳定行为已经在控制台上[这个问题仍然作为jdk8u77的一部分存在]。
因此,nextLine读取空白输入并向前移动。
解决方案:每次使用scannerObj.nextLine()
后始终添加scannerObj.nextInt()