1

我目前正在尝试同时接受两个数组的输入。原因是数组每个位置的数据都是对应的,例如。姓名和身份证号码。

String[] arr = new String[5];
    int[] arr1 = new int[5];

    Scanner kb = new Scanner(System.in);
    for(int i = 0; i<5; i++)
    {
        System.out.println("Enter a name:");
        arr[i] = kb.nextLine();
        System.out.println("Enter an ID:");
        arr1[i] = kb.nextInt();
    }

到目前为止我有这个代码,但是每当我运行它时,它会要求一个名称和 ID 一次,然后要求两者,但只会接受 ID。

我似乎无法弄清楚为什么它不允许输入名称,它只是为此返回一个不兼容的数据类型错误。

4

3 回答 3

5

从第二次迭代开始kb.nextLine(),读取 name 的您会吞下输入的\n换行符以输入 ID 整数。

实际问题是nextInt()留下char不是数字标记的标记,因此它们留在stdin. 每当任何其他方法尝试读取stdin该方法时都会采用该输入。nextLine方法在 之后返回\n,因此出现了问题。

因此,像这样更改代码:

String[] arr = new String[5];
        int[] arr1 = new int[5];

        Scanner kb = new Scanner(System.in);
        for(int i = 0; i<5; i++)
        {
            System.out.println("Enter a name:");
            arr[i] = kb.nextLine();
            System.out.println("Enter an ID:");
            arr1[i] = kb.nextInt();
            kb.nextLine();  //now this swallows new line
        }

或者您可以使用两个扫描仪:如果您想要输入它们不应该有这样的关系......根本没有冲突......我不知道这是否效率较低。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Tester {

public static void main(String[] args) throws Exception {

String[] arr = new String[5];
        int[] arr1 = new int[5];

        Scanner kb = new Scanner(System.in);
        Scanner  bc=new Scanner(System.in);
        for(int i = 0; i<5; i++)
        {
            System.out.println("Enter a name:");
            arr[i] = kb.nextLine();
            System.out.println("Enter an ID:");
            arr1[i] = bc.nextInt();
        }}
}
于 2013-06-03T09:18:04.323 回答
0

你得到了你描述的行为,因为nextInt()只读取下一行的下一个整数,而不是该行的其余部分(这是空的。)所以当循环回来并nextLine()调用该方法时,它会拾取其余部分(空)行。您应该kb.nextLine()在循环的末尾放置一个方法,然后它会按照您的描述进行。

但是,像这样在并行数组中输入数据并不是最佳实践——您可能应该创建一个自定义类,然后将数组类型作为该类,或者使用 ID 到名称的映射。

于 2013-06-03T09:19:16.293 回答
0

对我来说,这听起来像换行符在kb.nextInt()调用后仍然存储在输入缓冲区中,所以当你调用kb.nextLine()它时,它会读取这个换行符(作为一个空字符串,因为nextLine()函数将在它遇到的第一个换行符处停止,因此你的程序要求您输入下一个 ID。
有效地跳过任何后续要求名称的时间。

我可能会在kb.nextLine()调用后直接添加另一个调用kb.nextInt()以从缓冲区中清除 \n (换行符)字符。

于 2013-06-03T09:20:07.467 回答