Java - 当我在输入字符串数据之前输入字符串数据时,扫描器仅执行 Int 和 "skip" 字符串数据类型
Java - Scanner execute only the Int and "skip" the Strings data types when i input String data before the Int ones
当我使用 java.util.Scanner
时,我尝试在数据输入中使用整数和 String
s。
我遇到的问题是,当我在输入 String 数据之前输入 Int 数据时,控制台会跳过 String 数据并立即转到下一个 Int 数据。
这是我发生问题的简单问题:
package justForTest;
import java.util.Scanner;
public class EmptySpaceWorkshop {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("- Enter your Name : ");
String name = input.nextLine();
System.out.print("- Enter your IC number : ");
int icNumber = input.nextInt();
System.out.print("- Enter your Place of birth : ");
String placeOfBirth = input.nextLine();
System.out.print("- Enter your Age : ");
int age = input.nextInt();
System.out.println("There once was a wonderful person named " + name+ ", His IC number is " + icNumber );
System.out.println(". He/She is " + age + " years old. She/He was born at " + placeOfBirth );
}
}
这是我的输出:
- Enter your Name : Ali HISOKA
- Enter your IC number : 123456
- Enter your Place of birth : - Enter your Age :
我尝试了很多来解决这个问题。我能想到的唯一解决方案是使用 input.next();
而不是 input.nextLine();
。然而,这个解决方案对我来说是无用的,因为你们知道,当使用 input.next();
时我们只能输入一个单词,不像 input.nextLine();
我们可以输入很多单词,这就是我的意思寻找。我也不想重新排序(重新排列)我的输入并首先输入字符串数据,然后输入 Int 数据来解决我的问题。我希望我的数据与您在我的简单程序中看到的相同类型(输入姓名、输入身份证号码、输入出生地,然后输入年龄)。那我能解决这个问题吗?
我在互联网上搜索了很多,想找到和我一样有问题的人,但我找不到问题和解决方案,因为我的问题看起来和我的一模一样。
我已经知道我的问题的原因和解释
Joshua
"The reason for the error is that the nextInt only pulls the integer,
not the newline. If you add a in.nextLine() before your for loop, it
will eat the empty new line and allow you to enter 3 names."
但还是没有解决我的问题
这有点令人困惑,因为您发布的代码并没有显示您原来的问题,而是显示了解决方法后的情况。
您需要跳过 nextInt()
之后的换行符
System.out.print("- Enter your IC number : ");
int icNumber = input.nextInt();
input.skip("\n");
如果没有跳过,input.newLine
(出生地)将匹配输入身份证号码后的换行符,并提示您输入年龄。
我在我的机器上尝试了你的代码,没有做任何更改,它的工作 fine.Below 是我的输出。
- 输入您的姓名:yash
- 输入您的身份证号码:12
- 输入您的出生地:alg
- 输入您的年龄:25
曾经有一个很棒的人叫亚什,他的身份证号码是12
. He/She今年25岁。 She/He 出生于 alg
据我所见,readLine()
似乎只是在使用从缓冲区中取出 int 后留下的换行符。解决此问题的更好方法是使用 nextLine()
获取字符串值并将其转换:
int icNumber = Integer.parseInt(input.nextLine());
将您的输入视为单个字符串:
"Ali HISOKA\n123456\nPLACE\n99"
next()
消耗第一个单词,直到第一个白色 space - 例如" "
或 "\n"
nextLine()
消耗第一个单词,直到第一个换行符
nextInt()
消耗第一个单词,如 next()
,并将其解析为 int - 如果无法解析单词,它将抛出异常。
现在,让我们看看您的通话消耗了什么:
nextLine()
将return"Ali HISOKA"
,剩下的字符串就是"123456\nPLACE\n99"
nextInt()
将return int 123456
,剩下的字符串就是"\nPLACE\n99"
nextLine()
将return空串""
,剩下的串就是"PLACE\n99"
nextInt()
将抛出异常,因为它会尝试将 "PLACE"
解析为 int.
诀窍在第 2 步 - 尽管 nextInt()
消耗了单词之间的所有白色 space,但是它不消耗换行符,因此第 3 步中的 nextLine()
读取为空字符串,因为 "\n"
是剩余字符串中的第一个字符。
有两种解决方法:
- 您可以阅读并解析整行
Integer.parseInt(input.nextLine())
而不是使用 nextInt()
。如果该行包含几个词,例如"1234 abc"
会抛出异常。
- 在调用
nextInt()
之后调用 input.nextLine()
,因此它会消耗剩余的字符串直到第一个换行符。对于输入 "1234 abc"
它将忽略数字后的所有内容。
我会推荐第一个解决方案,因为当您被要求输入号码并回答“123 abc”时,这不是有效答案。在这种情况下,应该告知用户输入无效,而不是只从该答案中提取有效部分——用户不会知道他的部分答案被忽略了。
当我使用 java.util.Scanner
时,我尝试在数据输入中使用整数和 String
s。
我遇到的问题是,当我在输入 String 数据之前输入 Int 数据时,控制台会跳过 String 数据并立即转到下一个 Int 数据。
这是我发生问题的简单问题:
package justForTest;
import java.util.Scanner;
public class EmptySpaceWorkshop {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("- Enter your Name : ");
String name = input.nextLine();
System.out.print("- Enter your IC number : ");
int icNumber = input.nextInt();
System.out.print("- Enter your Place of birth : ");
String placeOfBirth = input.nextLine();
System.out.print("- Enter your Age : ");
int age = input.nextInt();
System.out.println("There once was a wonderful person named " + name+ ", His IC number is " + icNumber );
System.out.println(". He/She is " + age + " years old. She/He was born at " + placeOfBirth );
}
}
这是我的输出:
- Enter your Name : Ali HISOKA
- Enter your IC number : 123456
- Enter your Place of birth : - Enter your Age :
我尝试了很多来解决这个问题。我能想到的唯一解决方案是使用 input.next();
而不是 input.nextLine();
。然而,这个解决方案对我来说是无用的,因为你们知道,当使用 input.next();
时我们只能输入一个单词,不像 input.nextLine();
我们可以输入很多单词,这就是我的意思寻找。我也不想重新排序(重新排列)我的输入并首先输入字符串数据,然后输入 Int 数据来解决我的问题。我希望我的数据与您在我的简单程序中看到的相同类型(输入姓名、输入身份证号码、输入出生地,然后输入年龄)。那我能解决这个问题吗?
我在互联网上搜索了很多,想找到和我一样有问题的人,但我找不到问题和解决方案,因为我的问题看起来和我的一模一样。
我已经知道我的问题的原因和解释
Joshua
"The reason for the error is that the nextInt only pulls the integer, not the newline. If you add a in.nextLine() before your for loop, it will eat the empty new line and allow you to enter 3 names."
但还是没有解决我的问题
这有点令人困惑,因为您发布的代码并没有显示您原来的问题,而是显示了解决方法后的情况。
您需要跳过 nextInt()
System.out.print("- Enter your IC number : ");
int icNumber = input.nextInt();
input.skip("\n");
如果没有跳过,input.newLine
(出生地)将匹配输入身份证号码后的换行符,并提示您输入年龄。
我在我的机器上尝试了你的代码,没有做任何更改,它的工作 fine.Below 是我的输出。
- 输入您的姓名:yash
- 输入您的身份证号码:12
- 输入您的出生地:alg
- 输入您的年龄:25 曾经有一个很棒的人叫亚什,他的身份证号码是12 . He/She今年25岁。 She/He 出生于 alg
据我所见,readLine()
似乎只是在使用从缓冲区中取出 int 后留下的换行符。解决此问题的更好方法是使用 nextLine()
获取字符串值并将其转换:
int icNumber = Integer.parseInt(input.nextLine());
将您的输入视为单个字符串:
"Ali HISOKA\n123456\nPLACE\n99"
next()
消耗第一个单词,直到第一个白色 space - 例如" "
或"\n"
nextLine()
消耗第一个单词,直到第一个换行符nextInt()
消耗第一个单词,如next()
,并将其解析为 int - 如果无法解析单词,它将抛出异常。
现在,让我们看看您的通话消耗了什么:
nextLine()
将return"Ali HISOKA"
,剩下的字符串就是"123456\nPLACE\n99"
nextInt()
将return int123456
,剩下的字符串就是"\nPLACE\n99"
nextLine()
将return空串""
,剩下的串就是"PLACE\n99"
nextInt()
将抛出异常,因为它会尝试将"PLACE"
解析为 int.
诀窍在第 2 步 - 尽管 nextInt()
消耗了单词之间的所有白色 space,但是它不消耗换行符,因此第 3 步中的 nextLine()
读取为空字符串,因为 "\n"
是剩余字符串中的第一个字符。
有两种解决方法:
- 您可以阅读并解析整行
Integer.parseInt(input.nextLine())
而不是使用nextInt()
。如果该行包含几个词,例如"1234 abc"
会抛出异常。 - 在调用
nextInt()
之后调用input.nextLine()
,因此它会消耗剩余的字符串直到第一个换行符。对于输入"1234 abc"
它将忽略数字后的所有内容。
我会推荐第一个解决方案,因为当您被要求输入号码并回答“123 abc”时,这不是有效答案。在这种情况下,应该告知用户输入无效,而不是只从该答案中提取有效部分——用户不会知道他的部分答案被忽略了。