【问题标题】:Why is this an array out of bounds exception?为什么这是一个数组越界异常?
【发布时间】:2012-11-08 00:32:45
【问题描述】:
为什么会导致数组越界异常?
x[10][2] = 5;
这是否应该分配第 11 个数组的第 3 个位置,值 5
我以矩形的方式思考它。
就像我们必须计算 11 行(代表 10 个数组)
然后我们必须转到第 3 列,即 2
或
我应该将其视为一个数组,在实际上不存在的大小为 2 的数组中寻找第 11 个位置?
【问题讨论】:
标签:
java
arrays
multidimensional-array
indexoutofboundsexception
【解决方案1】:
x的第11个元素是数组吗?如果是,它的长度是多少?
您收到该错误是因为该元素的长度可能小于 3。
通过尝试来测试它
System.out.printf(x[10].length);
希望对您有所帮助。
【解决方案2】:
为什么会导致数组越界异常?
x[10][2] = 5;
只有当您尝试访问超出您为数组定义的范围的位置时,才会发生这种情况。例如
int x[20][20];
你可以使 x[10][2] = 5;没有问题,因为 10
x[30][20] = 5;
您将遇到越界异常,因为您正试图访问二维数组的位置 (30,20),该位置超出了二维数组的大小。
【解决方案3】:
这是因为x[10][2]不存在。
这可能是因为x[10] 不是有效元素(即x.length 等于或大于10),或者x[10][2] 不是有效元素(即x[10].length 等于或大于2)。异常消息会告诉您哪个索引失败(如果它们不同)。
请注意,多维数组不一定是矩阵。这称为jagged array。
例如,考虑以下代码(来自维基百科):
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] 则不会。
正如 Mark Stevens 在 cmets 中已经提到的,哪一个是行,哪一个是列,是主观的。与 jazzbassrob 在 cmets 中所说的相反,Java 既没有行优先也没有列优先。事实上,在Java中,并没有二维数组这种东西,相反,它实际上是一个数组的数组。