线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:第9行的2

时间:2014-04-11 09:51:36

标签: java

我想在“2 d”阵列中生成随机数但我不明白为什么我会遇到这个错误?

我的代码:

package rand;

import java.util.Arrays;
import java.util.Collections;

public class random {
    public static void main( String [] args){
        Integer[][] arr = new Integer[2][2];
        for (int i = 0; i < arr[2].length; i++) 
        {
            for(int j=0; j<arr[2].length;j++)
            arr[i][j] = i;
        }
        Collections.shuffle(Arrays.asList(arr));
        System.out.println(Arrays.toString(arr));

    }

}
控制台出现

错误:

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:2   在rand.random.main(random.java:9)

任何想法???

4 个答案:

答案 0 :(得分:3)

您引用arr[2],但其大小为2

也就是说,一个索引的大小。

数组是从0开始的。

参考arr[1]代替。

甚至更好,参考arr[arr.length - 1]

首先进行循环

for (int i = 0; i < arr[arr.length - 1].length; i++) 

嵌套for循环

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

答案 1 :(得分:1)

问题

错误来自对arr[2]的访问,而只有索引01对于大小为2的数组有效(从0开始的索引)。

解决方案

您的限制应该是:

    第一个循环中的
  • i < arr.length
  • j < arr[i].length在第二个循环中。

解释

作为一般规则,访问something[index]需要0 <= index < something.length

你的情况有什么不对:

  • 在第一个循环中,您可以使用something替换arr,索引为i。您正在定义用于访问i 的索引arr[i],而不会将其限制在arr 的范围内。

  • 在第二个循环中,您可以使用something替换arr[i],索引为j。您正在定义用于访问j的索引arr[i][j],但 j不能保证在arr[i]范围内,因为您在arr[2] 的范围内定义它(顺便说一句,不存在)。

答案 2 :(得分:0)

    for (int i = 0; i < arr.length; i++) 
    {
        for(int j=0; j<arr[i].length;j++)
        arr[i][j] = i;
    }

答案 3 :(得分:0)

在java中,数组索引从0开始。在你的程序中,你试图从数组的3位置获取数据。虽然数组的大小是2.这就是你得到ArrayIndexOutOfBoundsException的原因。如果你在循环中放入1而不是2。你不会遇到任何问题。 像这样

import java.util.Arrays;
import java.util.Collections;

public class random
{
    public static void main( String [] args)
    {
        Integer[][] arr = new Integer[2][2];
        for (int i = 0; i < arr[1].length; i++)
        {
            for(int j=0; j<arr[1].length;j++)
            {
              arr[i][j] = i;
              int iData=Math.random()*(int)arr[i][j];
            }
        }
        Collections.shuffle(Arrays.asList(arr));
        System.out.println(Arrays.toString(arr));
    }
}

当您运行上述程序时,您将获得以下输出。

[[Ljava.lang.Integer;@19821f, [Ljava.lang.Integer;@addbf1]

按任意键继续。 。