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
。它仍然提示输入,但它没有接受我输入的任何内容。
答案 0 :(得分:3)
Scanner
的{{3}}方法首先扫描下一个令牌,然后将其转换为正确的类型(例如int
in 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();
}
(但在这种情况下我没有看到附加价值)。