当我使用java.util.Scanner
时,我尝试在数据输入时使用整数和String
。
我面临的问题是,当我在字符串数据之前输入 Int 数据时,控制台会跳过字符串数据并立即转到下一个 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 数据来解决我的问题。我希望我的数据与您上面在我的简单程序中看到的排序相同(输入姓名,输入IC号,输入出生地,然后输入年龄)。那么我可以解决这个问题吗?
我在互联网上搜索了很多,寻找有人遇到了我的问题,但我找不到问题和解决方案,问题看起来和我的一模一样。
我已经知道原因和我的问题的解释,解释如下
乔舒亚
"错误的原因是nextInt只拉取整数, 不是换行符。如果你在 for 循环之前添加一个 in.nextLine(),它会 将吃掉空的新行,并允许您输入 3 个名称。
但这仍然无助于解决我的问题。
将您的输入视为单个字符串:
"Ali HISOKAn123456nPLACEn99"
-
next()
消耗第一个单词,直到第一个空格 - 例如" "
或"n"
-
nextLine()
使用第一个单词,直到第一个换行符 -
nextInt()
使用第一个单词,如next()
,并将其解析为 int - 如果无法解析该字,它将引发异常。
现在,让我们看一下您的通话消耗了多少:
-
nextLine()
将返回"Ali HISOKA"
,则剩余的字符串"123456nPLACEn99"
-
nextInt()
将返回 int123456
,则剩余的字符串"nPLACEn99"
-
nextLine()
将返回空字符串""
,则剩余的字符串"PLACEn99"
-
nextInt()
会抛出异常,因为它会尝试将"PLACE"
解析为 int。
诀窍在步骤 2 中 - 虽然nextInt()
消耗单词之间的所有空格,但它不会消耗换行符,因此步骤 3 中的nextLine()
读取空字符串"n"
因为是剩余字符串中的第一个字符。
有两种解决方案:
- 您可以使用
Integer.parseInt(input.nextLine())
读取和解析整行,而不是使用nextInt()
。如果该行包含几个单词,例如"1234 abc"
它将引发异常。 - 调用
nextInt()
后调用input.nextLine()
,因此它会消耗剩余的字符串,直到第一个换行符。对于输入"1234 abc"
它将忽略数字后面的所有内容。
我会推荐第一个解决方案,因为当您被要求输入号码并回答"123 abc"时,这不是一个有效的答案。在这种情况下,应该告诉用户输入是无效的,而不是只从该答案中获取有效部分 - 用户将不知道他的部分答案被忽略了。
据我所知,readLine()
似乎只是消耗从缓冲区中取出 int 后留下的换行符。解决此问题的更好方法是使用 nextLine()
获取字符串值并将其转换:
int icNumber = Integer.parseInt(input.nextLine());
这有点令人困惑,因为您发布的代码没有显示您的原始问题,而是显示变通方法后的情况。
您需要在nextInt()
后跳过换行
System.out.print("- Enter your IC number : ");
int icNumber = input.nextInt();
input.skip("\n");
如果没有跳过,input.newLine
(对于出生地)将匹配输入的 IC 编号后的换行符,系统将提示您输入年龄。
我在我的机器上尝试了您的代码,没有进行任何更改,并且工作正常。下面是我的输出。
- 输入您的姓名 : 雅什
- 输入您的身份证号码 : 12
- 输入您的出生地 : 藻类
- 输入您的年龄 : 25从前有一个叫亚什的好人,他的身份证号码是12.他/她今年 25 岁。她/他出生在阿尔格