【问题标题】:foreach loop error throws outofbounds exception after taking input [duplicate]foreach 循环错误在接受输入后引发 outofbounds 异常[重复]
【发布时间】:2019-03-29 09:00:34
【问题描述】:

我正在尝试使用 for-each 循环在已初始化的数组中输入输入,但它会抛出越界异常

import java.util.Scanner;

class Hello {

 public static void main(String[] args){

     int[] a = new int[9];

     Scanner sc = new Scanner(System.in);

     for(int i:a)
    {
      a[i]=sc.nextInt();
    }
      System.out.println("entered elements:");
      for(int x : a)
    {System.out.println("  "+a[x]);
    }
 }
}

接受输入后,出现越界异常

【问题讨论】:

  • 在第一个循环中,i 将始终为 0,而对于第二个循环,x 将是您最后输入的任何值,可能大于 8。我建议您删除此代码并重新开始。使用while 可能是第一个循环的最佳选择,否则经典的for(int i = 0; ...) 循环类型是另一种选择

标签: java arrays indexoutofboundsexception


【解决方案1】:

这个

 for(int i:a)
{
  a[i]=sc.nextInt();
}

将每个输入整数存储在a[0],因为数组初始化为0。所以这本质上很糟糕。但尽管如此:

  for(int x : a)
{ System.out.println("  "+a); }

所以你不会越界异常。

总的来说,我认为你想做的是

int[] a = new int[9];

 Scanner sc = new Scanner(System.in);

 for(int i=0;i<a.length.i++){
  a[i]=sc.nextInt();
}
  System.out.println("entered elements:");
  for(int x : a){
     System.out.println("  "+x);
}

【讨论】:

    【解决方案2】:

    您正在迭代值而不是索引。

    int[] a = new int[9];  is equal to
    
    int[] a = {0,0,0,0,0,0,0,0,0};
    

    因此 i 始终为 0,您只将输入存储在 a[0]

      for(int i:a){
           a[i]=sc.nextInt();
      }
    

    【讨论】:

      【解决方案3】:

      欢迎使用 stackoverflow!

      让我们快速回顾一下我认为你试图在高层次上做的事情:

      • 初始化一个数组(大小为 9)
      • 使用循环遍历数组,并将数组中的值设置为循环中的位置,作为扫描仪中的下一个整数
      • 最后,再次遍历数组,打印出数组中每个位置的元素

      但是,它不能按预期工作的原因很少:

      您的数组是 int 类型的数组,它是原始类型(因此在 Java 中不被视为对象)-因此它不能像对象一样为 null。因此,您的数组中的值被分配了一个默认值 0 ({0,0,0,0,etc})。

      考虑到这一点,第一个循环:

           for(int i:a)
           {
             a[i]=sc.nextInt();
           }
      

      将遍历数组 - 但数组中的每个值都是 0, 所以它会继续设置:

       a[0]=sc.NextInt();
      

      这可以通过使用这个循环条件来解决,它根据数组的长度进行迭代 - i 表示数组中的位置,而不是数组中的值:

               for (int i=0;i<a.length;i++)
               {
                 a[i] = sc.nextInt();
               }
      

      最后,当您再次迭代数组中的值时,您的最后一次打印导致超出范围异常 - 假设上一个循环中的 sc.nextInt() 返回值 15 - 当您尝试向上循环时位置 a[15] - 它不存在,因此您会看到越界错误。

      您可以通过简单地打印出数组中的当前值来解决此问题:

        for(int scannerValue : a)
         {
              System.out.println(scannerValue);
         }
      

      【讨论】:

        【解决方案4】:
        System.out.println("  "+a[x]);
        

        应该是

        System.out.println("  "+x);
        

        而不是使用 for each 只需使用简单的 for 循环,如下所示:

        class Hello {
        
            public static void main(String[] args) {
                int[] a = new int[9];
                Scanner sc = new Scanner(System.in);
                for (int i=0;i<a.length;i++) {
                    a[i] = sc.nextInt();
                }
                System.out.println("entered elements:");
                for (int x : a) {
                    System.out.println("  " +x);
                }
                sc.close();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-27
          • 1970-01-01
          • 2018-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多