1

为什么这会导致数组越界异常?

 x[10][2] = 5;

如果这是分配第 11 个数组的第 3 个位置,则值 5

我以矩形的方式思考它。就像我们必须计算 11 行(代表 10 个数组)然后我们必须转到第 3 列,即 2

或者

我应该将其视为一个数组,在实际上不存在的大小为 2 的数组中寻找第 11 个位置?

4

3 回答 3

0

为什么这会导致数组越界异常?

 x[10][2] = 5;

只有当您尝试访问超出您为数组定义的范围的位置时,才会发生这种情况。例如

int x[20][20];

你可以使 x[10][2] = 5; 没有问题,因为 10 < 20 和 2 < 20。但如果你这样做了:

x[30][20] = 5;

您将遇到越界异常,因为您正在尝试访问 2D 数组的位置 (30,20),该位置超过了 2D 数组的大小。

于 2012-11-21T04:26:33.647 回答
0

x的第 11 个元素是数组吗?如果是,它的长度是多少?
您收到该错误是因为该元素的长度可能小于 3。
通过尝试对其进行测试

 
  System.out.printf(x[10].length);
 

希望有帮助。

于 2012-11-21T04:36:37.923 回答
0

那是因为x[10][2]不存在。

它可能是因为x[10]不是有效元素(即x.length等于或大于 10),或者x[10][2]不是有效元素(即x[10].length等于或大于 2)。异常消息会告诉您哪个索引失败(如果它们不同)。

请注意,多维数组不一定是矩阵。这称为锯齿状数组

例如,考虑以下代码(来自 Wikipedia):

int[][] arr = new int[2][]; // creates 2 rows
arr[0] = new int[3]; // 3 columns for row 0
arr[1] = new int[5]; // create 5 columns for row 1

引用arr[0][4]会抛出一个ArrayIndexOutOfBoundsException,而引用arr[1][4]不会。


正如马克史蒂文斯在评论中已经提到的,哪一个是行,哪一个是列,是主观的。与 jazzbassrob 在评论中所说的相反,Java 既没有行优先也没有列优先。事实上,在 Java 中,并没有二维数组这种东西,相反,它实际上是一个数组的数组。

于 2018-11-01T16:27:50.910 回答