扫描仪的 nextLine() 问题
nextLine() issues with Scanner
我有两个 do-while
循环来进行自定义输入验证。问题是它会自动进入下一个 do-while
循环。我必须在正确插入名称后添加一个新的 nextLine()
:name = scanner.nextLine();
我知道 nextInt()
的“故障”,当光标停留在那里时,您必须调用 nextLine()
才能继续。资料来源:https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/
但事实并非如此。我显然遗漏了一些东西...
String name = "";
boolean flag_name= false;
do{
System.out.print("Name: ");
if(scanner.hasNextInt()){
System.out.println(scanner.nextInt() + " That's not a valid name...\n");
scanner.nextLine();
}else{
name = scanner.nextLine();
flag_name = true;
}
}while(!flag_name);
int age = 0;
boolean good_age = false;
do {
System.out.print("Age: ");
if (!scanner.hasNextInt()){
System.out.println("That's not a valid age.");
}else if(scanner.nextInt() <= 3 || scanner.nextInt() >= 125) {
System.out.println("You must be over 3yo.");
scanner.nextLine();
}else{
age = Integer.parseInt(scanner.nextLine());
good_age = true;
}
}while (!good_age);
输出:
Name: mark
Age: 'mark' That's not a valid age.
Age:
我终于发现我已经带着一个乱七八糟的扫描仪来了。在上一步中,我有一个无人值守的 scanner.next();
,这使得它之后的所有内容都表现不正常。
System.out.print("Insert an option (1,2,3): ");
input = scanner.next();
// changed:
input = scanner.nextLine();
为后续步骤修复了扫描仪。
我还应用了@AppleCiderGuy 提到的逻辑并修复了我的第二个 do-while 循环。
最终代码:
String name = "";
boolean flag_name= false;
do{
System.out.print("Name: ");
if(scanner.hasNextInt()){
System.out.println("That's not a valid name...");
scanner.nextLine();
}else{
name = scanner.nextLine();
flag_name = true;
}
}while(!flag_name);
int age = 0;
boolean good_age = false;
do {
System.out.print("Age: ");
if (!scanner.hasNextInt()) {
System.out.println("That's not a valid age.");
scanner.nextLine();
}else{
age = Integer.parseInt(scanner.nextLine());
if(age <= 3 || age >= 125) {
System.out.println("You must be over 3yo.");
}else{
good_age = true;
}
}
}while (!good_age);
经验教训:
- 当输入不正确时,您将始终需要
scanner.nextLine();
来清洁扫描仪。否则错误的输入将留在扫描器中,并弄乱后续代码。
- 当您使用整数时,即使正确分配给变量,您也需要清洁扫描仪。对我来说使用
Integer.parseInt(scanner.nextLine());
更容易。
- 始终尝试评估变量而不是
scanner.next*
方法。因为扫描仪将等待更多输入。
谢谢。
我有两个 do-while
循环来进行自定义输入验证。问题是它会自动进入下一个 do-while
循环。我必须在正确插入名称后添加一个新的 nextLine()
:name = scanner.nextLine();
我知道 nextInt()
的“故障”,当光标停留在那里时,您必须调用 nextLine()
才能继续。资料来源:https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/
但事实并非如此。我显然遗漏了一些东西...
String name = "";
boolean flag_name= false;
do{
System.out.print("Name: ");
if(scanner.hasNextInt()){
System.out.println(scanner.nextInt() + " That's not a valid name...\n");
scanner.nextLine();
}else{
name = scanner.nextLine();
flag_name = true;
}
}while(!flag_name);
int age = 0;
boolean good_age = false;
do {
System.out.print("Age: ");
if (!scanner.hasNextInt()){
System.out.println("That's not a valid age.");
}else if(scanner.nextInt() <= 3 || scanner.nextInt() >= 125) {
System.out.println("You must be over 3yo.");
scanner.nextLine();
}else{
age = Integer.parseInt(scanner.nextLine());
good_age = true;
}
}while (!good_age);
输出:
Name: mark
Age: 'mark' That's not a valid age.
Age:
我终于发现我已经带着一个乱七八糟的扫描仪来了。在上一步中,我有一个无人值守的 scanner.next();
,这使得它之后的所有内容都表现不正常。
System.out.print("Insert an option (1,2,3): ");
input = scanner.next();
// changed:
input = scanner.nextLine();
为后续步骤修复了扫描仪。
我还应用了@AppleCiderGuy 提到的逻辑并修复了我的第二个 do-while 循环。
最终代码:
String name = "";
boolean flag_name= false;
do{
System.out.print("Name: ");
if(scanner.hasNextInt()){
System.out.println("That's not a valid name...");
scanner.nextLine();
}else{
name = scanner.nextLine();
flag_name = true;
}
}while(!flag_name);
int age = 0;
boolean good_age = false;
do {
System.out.print("Age: ");
if (!scanner.hasNextInt()) {
System.out.println("That's not a valid age.");
scanner.nextLine();
}else{
age = Integer.parseInt(scanner.nextLine());
if(age <= 3 || age >= 125) {
System.out.println("You must be over 3yo.");
}else{
good_age = true;
}
}
}while (!good_age);
经验教训:
- 当输入不正确时,您将始终需要
scanner.nextLine();
来清洁扫描仪。否则错误的输入将留在扫描器中,并弄乱后续代码。 - 当您使用整数时,即使正确分配给变量,您也需要清洁扫描仪。对我来说使用
Integer.parseInt(scanner.nextLine());
更容易。 - 始终尝试评估变量而不是
scanner.next*
方法。因为扫描仪将等待更多输入。
谢谢。