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