【问题标题】:"for" loop does not iterate the way I want [duplicate]“for”循环不会以我想要的方式迭代[重复]
【发布时间】:2013-10-20 07:38:00
【问题描述】:

我正在尝试从用户那里获取 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();

【问题讨论】:

  • 对不起,我对编程和这个网站比较陌生。有什么例外是什么意思?
  • 控制台/日志中的任何错误
  • java.util.Scanner 的 java.util.Scanner.next(Unknown Source) 的 java.util.Scanner.throwFor(Unknown Source) 的线程“main”java.util.InputMismatchException 中的异常。 nextInt(Unknown Source) at java.util.Scanner.nextInt(Unknown Source) at HockeyTester.main(HockeyTester.java:28)
  • java.util.InputMismatchException。您似乎没有输入数字(keyboard.nextInt() 需要一个整数,但它会得到其他内容)
  • @John: NP,但代码应始终发布在问题本身...

标签: java arrays loops object


【解决方案1】:

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

First Player Name
1
Second Player Name
2

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

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

【讨论】:

  • 丹尼斯,哇!使用 nextLine 调用确实有效。太感谢了。但我实际上发现了另一个问题。我正在尝试使用“增强的for循环”打印出数据,但它并没有按照我想要的方式出现。 for(HockeyPlayer val : array) { System.out.println("球员是:"); System.out.println(val); }
  • 让我猜,你想打印出“球员是:”,然后是每个球员的名字?
  • 没错,在不同的行上也有他们的数字。举个例子:白兰地 33 约翰 21
  • 然后将System.out.println("The players are:")拉出循环,并在循环内打印玩家信息。随意调整空格。
  • 另外,请不要编辑问题来处理完全不同的问题。如果您最终在以您想要的方式进行漂亮的打印时遇到重大问题,请发布一个不同的问题。
【解决方案2】:

来自InputMismatchException'sJavaDoc:

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

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

【讨论】:

  • 是的,你是对的,但我希望它先要求一个字符串,然后要求一个 int。我不知道为什么它首先需要 int。
【解决方案3】:

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

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

【讨论】:

  • 在 cmets 中,她提到她在第一个循环中获得了 InputMismatchException。在她解决了最初的问题后,她说她在以她想要的方式打印信息时遇到了问题,然后才将问题编辑为第二个 for 循环。
【解决方案4】:

我假设您的键盘变量是 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;
        }

【讨论】:

    【解决方案5】:

    很好搭配:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多