双阵列:超出界限

时间:2015-07-26 14:25:04

标签: java

我正在尝试编写一个代码来查找2D数组的平均值:

这就是我写的:

public class AverageLength
{
  public static void main(String[] args)
  {
    int sum = 0;
    int w = 0;
    int[][] foobar = new int[][]
    {
      {0, 5, 7},
      {3, 2, 4},
      {8, 7, 3},
      {1, 5, 3}
    };
    for (int i = 0; i < foobar.length; i++)
    {
      for (int j = 0; j <foobar[0].length; j++)
      {
        System.out.println(foobar[i][j]);
        sum = sum + foobar[i][j];
        w++;
      }
    } System.out.println("Average = " + sum/w);
  }
}

但是,如果我更改数组长度并尝试以下内容:

    int[][] foobar = new int[][]
    {
      {0, 5, 7, 3},
      {3, 3, 5, 7, 8, 4},
      {8, 3},
      {1, 5, 1, 2, 3}
    };

它给了我以下错误:

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:2       在AverageLength.main(AverageLength.java:18)

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

更改

foobar[0].length

foobar[i].length

当你的子数组长度不同时,你应该得到相应的长度

例如

{0, 5, 7, 3},
{3, 3, 5, 7, 8, 4},
{8, 3},

在这种情况下

当你遍历第三个子数组foobar[0].length时,

{8, 3}是4。     当你尝试访问第二个索引[第三个元素]时会出现错误

ArrayIndexOutOfBoundsException: 2 

因为没有第二个索引。

以及第二个子数组{3, 3, 5, 7, 8, 4},中的值8和4将不会打印,因为您循环了4次。

答案 1 :(得分:0)

当您在数秒长度内检查数组长度时,您应该使用i而不是0,因为如果使用0,您将始终获得第一个数组的长度。

for (int j = 0; j <foobar[i].length; j++)

答案 2 :(得分:0)

使用foobar[0].length,您使用每个内部数组第一个内部数组的长度。请改用foobar[i].length,这将计算当前数组的长度。

顺便说一句:从Java8开始,计算int数组的平均值可以在java内部完成。如何使用Java8的流API 来解决此任务的示例:

import java.util.Arrays;

public class AverageLength
{
  public static void main(String[] args)
  {
    int[][] foobar = new int[][]
    {
      {0, 5, 7},
      {3, 2, 4},
      {8, 7, 3},
      {1, 5, 3}
    };

    System.out.print("Average = ");
    System.out.println(

            // convert 2D array to stream of arrays
            Arrays.stream(foobar)

            // flatten 2D array to 1D array
            .flatMapToInt(Arrays::stream)

            // let java calculate the average
            .average()

            // get result
            .getAsDouble());
  }
}

优点:

  • 代码更容易理解
  • 你的程序可能更快
  • 代码可以轻松更改为在多个线程中运行(使用.parallel()