Scanner console=new Scanner(System.in);
System.out.print("how many:");
int n=console.nextInt();
console.nextLine();
String firstName[]=new String[n];
String lastName[]=new String[n];
int zipCode[]=new int[n];
console.useDelimiter("[\t]");
for(int i=0;i<n;i++) {
System.out.print("Enter the first Name"+"Last Name"+"zipcode:");
firstName[i]=console.next();
lastName[i]=console.next();
zipCode[i]=console.nextInt();
console.nextLine();
}
使用制表符输入:
Test Tst 121
firstName[i]
初始化为Test
。 lastName[i]
初始化为Tst
。但是zipCode[i]
尚未初始化为121
。它仍然提示输入,但不占用我输入的任何内容。 最佳答案
next...()
的Scanner
方法始终先扫描下一个标记,然后将其转换为正确的类型(例如,在int
的情况下为nextInt()
)。
现在,令牌是不是定界符的字符序列。由于您设置的唯一定界符是制表符(\t
),因此即使输入新行,它也将继续搜索制表符,搜索不会停止。
基本上存在两种解决方案:
也允许使用新行:
console.useDelimiter("[\t\r\n]");
(并在循环末尾删除
.nextLine()
)。结果是,如果用新行将名字和姓氏分开,则Scanner
不会出错,因此:Test
Tst
121
也将被解析为
Test Tst 121
,尽管我对此没有太大问题。如果确实要禁用此功能,则可以在循环中设置和重置定界符。因此类似:
for(int i=0;i<n;i++) {
System.out.print("Enter the first Name"+"Last Name"+"zipcode:");
console.useDelimiter("[\t]");
firstName[i]=console.next();
lastName[i]=console.next();
console.useDelimiter("[\n]");
zipCode[i]=console.nextInt();
}
(但在这种情况下,我看不到增加的价值)。
关于java - 不能同时使用Scanner.next()和Scanner.nextInt(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28890999/