为什么这个Java 2D数组没有抛出IndexOutOfBoundException?

时间:2017-08-01 16:38:34

标签: java arrays

我正在初始化一个2D数组,同时指定行数和列数。如果我插入的项目多于初始化中声明的数字,我希望它会抛出一个错误,但代码工作正常。

static void arrayChecks(){
    int[][] arr = new int[2][2];
    arr[0] = new int[]{1,2};
    arr[1] = new int[]{3,4,5};   //adding 3 items to a 2-column row. No exception thrown
    //arr[2] = new int[]{6,7};   //throws ArrayIndexOutOfBoundsException as expected.
    for(int[] a : arr){
        for(int i : a){
            System.out.print(String.valueOf(i));
        }
    }
    //output = 12345
}

5 个答案:

答案 0 :(得分:10)

Java并不像某些语言那样支持2D数组。它只是将它们视为数组引用的数组。这些内部数组可以重新分配给任何长度的另一个数组。

int[][] arr = new int[2][2];的desugared版本是:

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

您可以将arr[1]重新分配给您想要的任何int[]。 Java允许锯齿状数组,其中每个内部数组的长度不同。

参考 - Example 15.10.2-2. Multi-Dimensional Array Creation

答案 1 :(得分:4)

根据Java语言规范,§15.10.2. Run-Time Evaluation of Array Creation ExpressionsExample 15.10.2-2. Multi-Dimensional Array Creation

  

宣言:

float[][] matrix = new float[3][3];
     

在行为上等同于:

float[][] matrix = new float[3][];
for (int d = 0; d < matrix.length; d++)
    matrix[d] = new float[3];

这意味着你的代码:

int[][] arr = new int[2][2];
arr[0] = new int[]{1,2};
arr[1] = new int[]{3,4,5};

与:

相同
int[][] arr = new int[2][];
for (int d = 0; d < arr.length; d++)
    arr[d] = new int[2];
arr[0] = new int[]{1,2};
arr[1] = new int[]{3,4,5};

或者:

int[][] arr = new int[2][];
arr[0] = new int[2];
arr[1] = new int[2];
arr[0] = new int[]{1,2};
arr[1] = new int[]{3,4,5};

如您所见,最后两个语句替换对2D数组创建表达式创建的两个子数组的引用。

这意味着结果与:

完全相同
int[][] arr = new int[2][];
arr[0] = new int[]{1,2};
arr[1] = new int[]{3,4,5};

除了你浪费时间和GC创建两个子阵列。

答案 2 :(得分:2)

new int[]{3,4,5}正在创建数组。这个新数组的长度现在为3。

如果您改为使用int[1][2] = 5,则会获得IndexOutOfBoundsException,因为这是在编辑旧数组。

有关更好的解释,请参阅The Truth About 2D Arrays

答案 3 :(得分:1)

我假设你带着其他语言的背景来到java世界。在Java中没有多维数组。表达式new int[2][2]实际上只是逐行构建数组数组的语法糖。这意味着没有“宽度”概念,每一行都可以拥有自己的长度。使用arr[1] = new int[]{3,4,5};,您只需用较长的行替换行,这有时(不幸的是)在Java世界中是有效的移动。如果你想避免事故,不要更换整行,逐个单元填充阵列:

int[][] arr = new int[2][2];
arr[1][0] = 3;
arr[1][1] = 4;
arr[1][2] = 5; # throws ArrayIndexOutOfBoundsException

答案 4 :(得分:0)

您正在创建一个新行。 如果你要调试你的代码,你会看到arr[1] = new int[]{3,4,5};之后你现在有了这个

enter image description here

如果你愿意这样做:

 int[][] arr = new int[2][2];
 arr[1][3] = 1;

您将获得ArrayIndexOutOfBoundsException