为什么我没有在二维数组上得到ArrayIndexOutOfBoundsException

时间:2015-09-09 07:37:03

标签: java arrays multidimensional-array

从我的理解到Java中的二维数组我知道它可以像这样初始化:

int a[][] = new int[3][1];

3->代表行

1->代表col

如图:

enter image description here

我的问题是为什么当我使用它时:

    int a[][] = new int[3][1]; 
    a[4] =new int[]{1,2,3,3,4};
    System.out.print(a[4][4]);

它给出了:

  

ArrayIndexOutOfBoundsException:由于大小为3,这是[4]超出索引的正确行为。

但是使用它不会产生任何异常:

        int a[][] = new int[3][1]; 
        a[1] = new int[]{1,2,3,3,4};
        a[2] = new int[]{4,5};
        System.out.print(a[1][4]);

即使初始化确实存在1 [4],但由于col的大小等于1,因此它超出了索引。

任何想法!

感谢。

3 个答案:

答案 0 :(得分:4)

分配时

a[1] = new int[]{1,2,3,3,4};

a[1]现在引用一个包含5个元素的int数组,因此a[1][4]有效。与原始a[1]引用的1个元素的int数组相比并不重要,因为在赋值之后,a[1]引用了一个新数组。

你应该记住,二维数组实际上是一个数组数组(即元素类型为数组的数组)。因此,您可以将新的内部数组分配给外部数组的任何索引。

答案 1 :(得分:1)

那是因为二维数组实际上是Array of Arrays

所以,当你这样做时,

int a[][] = new int[3][1];

转换为,

a[0] = new int[1];
a[1] = new int[1];
a[2] = new int[1];

不是,作为数组的a只有一个维度。但是它中的每个元素都可以包含另一个的任何长度的数组,但是int类型

所以,当你这样做时,

a[1] = new int[5];

它仍然有效。

答案 2 :(得分:0)

您已声明[1]为"新"这将覆盖数组大小计数