【问题标题】:Simple for loop issue with arrays数组的简单 for 循环问题
【发布时间】:2013-12-20 01:02:12
【问题描述】:

这是我现在的代码

for (int i = 0; i <= listOfPeople.length; i++){
    String name = scnr.nextLine();
    System.out.println("Person " + (i + 1) +  ": ");
    listOfPeople[i] = name;
}

人员列表是一个正确声明的字符串列表,其中包含用户发送的值的长度。发生的错误是,当我运行程序时,我得到了这个:

Person 1: 

Jordan

Person 2: 

Jordan

Person 3:

Jordan

Person 4: 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at RGG.main(RGG.java:20)

我不太确定出了什么问题,但我尝试在 for 循环声明中删除 =,然后得到以下输出:

Person 1: 

Jordan

Person 2: 

Jordan

Person 3: 

在第三个提示之后,代码继续前进,我无法在那里输入任何内容。 有谁知道可能会发生什么?提前致谢!

【问题讨论】:

  • 正如我在问题中所说,“我已尝试在 for 循环声明中删除 =”,但仍然失败,请参阅上述问题

标签: java arrays loops


【解决方案1】:

删除此表达式i &lt;= listOfPeople.length; 中的=。它导致您访问不存在的数组元素。

for (int i = 0; i < listOfPeople.length; i++){
        String name = scnr.nextLine();
        System.out.println("Person " + (i) +  ": ");
        listOfPeople[i] = name;
}

完整示例:

public class PersonArrayTest {

    public static void main(String[] args) {
        String[] listOfPeople = new String[5];
        assign(listOfPeople);
        System.out.println(Arrays.toString(listOfPeople));
    }

    public static void assign(String[] listOfPeople) {

        Scanner scnr = new Scanner(System.in);
        for (int i = 0; i < listOfPeople.length; i++) {
            String name = scnr.nextLine();
            System.out.println("Person " + (i) + ": ");
            listOfPeople[i] = name;
        }
    }
}

【讨论】:

    【解决方案2】:

    用这条线

    for (int i = 0; i <= listOfPeople.length; i++){
    

    您正在将数组末尾推进一个,长度为 3,有效索引为 0-2。 3 是无效索引。

    当您删除 = 时,您会得到正确的版本:

    for (int i = 0; i < listOfPeople.length; i++){
    

    2 迭代之后停止,这是数组的结尾,在你跑出数组的结尾之前。

    【讨论】:

      【解决方案3】:

      在 forloop 中更改 &lt;= 登录

      for (int i = 0; i < listOfPeople.length; i++)
      

      【讨论】:

        【解决方案4】:

        我有根据地猜测您正在使用Scanner#nextInt 来获取数组长度的输入。类似这样的东西:

        String[] listOfPeople = new String[scnr.nextInt()];
        

        我得到了这个,因为你的循环代码看起来像这样:

        输入 i == 0 打印提示 #1 输入 i == 1 打印提示 #2 输入 i == 2 打印提示 #3

        但是你的输出显示了这个:

        打印提示 #1 输入 i == 1 打印提示 #2 输入 i == 2 打印提示 #3

        所以实际上必须发生的是:

        默默地前进超过 scnr 仍然为 i == 0 保留的任何内容 打印提示 #1 输入 i == 1 打印提示 #2 输入 i == 2 打印提示 #3

        nextInt 孤立一个换行符。 (除了 nextLine 之外,任何对 next_ 的调用也是如此。)这就是您的第一个输入被跳过的原因。在循环的第一次迭代中调用 scnr.nextLine 只会使 Scanner 前进到最后一行。

        把循环改成这样:

        // skip the last new line
        scnr.nextLine();
        
        // < not <=
        for (int i = 0; i < listOfPeople.length; i++) {
        
            // prompt before input
            System.out.println("Person " + (i + 1) +  ": ");
        
            // you don't need that extra String
            listOfPeople[i] = scnr.nextLine();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-18
          • 2011-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多