2

我正在尝试从用户那里获取 3 名曲棍球运动员的姓名和球衣号码。然后,我使用我拥有的数据从我创建的名为 HockeyPlayer 的类中创建一个对象。然后我把它放入数组中。第二次迭代不起作用。请帮忙!先感谢您。

ArrayList<HockeyPlayer> array = new ArrayList<HockeyPlayer>();

//For loop to input names
for(int i=0; i < 3; i++)
{   
    System.out.print("Enter name of Player " + i +":");
    startName = keyboard.nextLine();
    System.out.print("Enter jersey number of Player " + i +":");
    playNum = keyboard.nextInt();

    //Make objects and add to array
    HockeyPlayer p = new HockeyPlayer(startName, playNum);
    array.add(p);
}
keyboard.close();
4

5 回答 5

4

这里的问题是,在循环的每次迭代中,您先调用nextLine(),然后调用nextInt(),但是在调用 之后nextInt(),还没有读取换行符。基本上,如果输入类似于

First Player Name
1
Second Player Name
2

然后,在你的循环的第一次迭代之后,Scanner刚刚读完1,而不是紧随其后的换行符。因此,在第二次迭代中,nextLine()处理 之后的换行符1,但处理该换行符。然后,nextInt()调用将尝试Second变成int,并抛出InputMismatchException

解决它的常见方法是在nextLine()调用之后立即进行另一个调用nextInt()(并丢弃这个额外的换行符),或者通过调用一次读取带有数字的行nextLine(),并解析出int使用Integer.parseInt().

于 2013-10-12T07:19:39.333 回答
2

来自InputMismatchException 的JavaDoc:

由 Scanner 抛出以指示检索到的令牌与预期类型的​​模式不匹配,或者令牌超出预期类型的​​范围。

您似乎输入了一个字符串,而 nextInt() 需要一个整数。

于 2013-10-12T07:15:43.137 回答
0

最好搭配:

int playNum = Integer.parseInt(sc.nextLine());
于 2013-10-12T09:09:22.740 回答
0

我假设您的键盘变量是 java.util.Scanner 类型的。如果这是真的,那么您需要在循环结束时调用 keybord.reset() 。

您的问题是keyboard.nextInt() 不会消耗您按Enter 时产生的行尾。此行尾字符负责您的异常。

此代码有效:

        HockeyPlayer [] hArr = new HockeyPlayer[3];

        for(int i=0; i < 3; i++)
        {   
            String startName = "";
            Scanner scanner = new Scanner(System.in);
            int playNum = 0;

            System.out.print("Enter name of Player " + i +":");
            startName = scanner.nextLine();
            System.out.print("Enter jersey number of Player " + i +":");
            playNum = scanner.nextInt();
            scanner.reset();

            HockeyPlayer p = new HockeyPlayer(startName, playNum);
            hArr[i] = p;
        }
于 2013-10-12T08:32:01.987 回答
0

如果第二次迭代是指第二次for,则可能必须覆盖您的HockeyPlayer.toString()方法。

public String toString() {
  return name+" "+startNum;
}
于 2013-10-12T07:39:39.930 回答