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。它仍然提示输入,但不占用我输入的任何内容。

最佳答案

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/

10-09 18:36
查看更多