不能一起使用Scanner.next()和Scanner.nextInt()

时间:2015-03-06 01:35:22

标签: java

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]初始化为TestlastName[i]已初始化为Tst。但zipCode[i]未初始化为121。它仍然提示输入,但它没有接受我输入的任何内容。

1 个答案:

答案 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();
}

(但在这种情况下我没有看到附加价值)。