“for”循环不会按照我想要的方式迭代

时间:2013-10-12 06:52:27

标签: java arrays loops object

我想从用户那里得到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();

5 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

来自InputMismatchException's JavaDoc:

由扫描程序抛出,表示检索到的令牌与预期类型的​​模式不匹配,或者令牌超出预期类型的​​范围。

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

答案 2 :(得分:0)

如果通过第二次迭代表示第二次for,则可能必须覆盖HockeyPlayer.toString()方法。

public String toString() {
  return name+" "+startNum;
}

答案 3 :(得分:0)

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

你的问题是keyboard.nextInt()不会消耗你输入时产生的行尾。这个行尾字符负责您的例外。

此代码有效:

        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;
        }

答案 4 :(得分:0)

最好配合:

int playNum = Integer.parseInt(sc.nextLine());