重新分配不同大小的原始数组会导致ArrayIndexOutOfBoundException
static int[] array = new int[1];
static int fun() {
array = new int[10];
return 3;
}
public static void main(String[] args) {
array[fun()] = 2;
}
为什么上面的代码给出 ArrayIndexOutOfBoundsException 而:
public static void main(String[] args) {
fun();
array[3] = 2;
}
才不是!
谢谢。
回答
这是由于在运行时评估数组访问的方式,如Java 语言规范的第 15.10.4 节所述:
在运行时,数组访问表达式的求值行为如下:
- 首先,评估数组引用表达式。如果此评估突然完成,则数组访问会出于同样的原因突然完成,并且不会评估索引表达式。
- 否则,将评估索引表达式。如果此评估突然完成,则出于相同原因,阵列访问也会突然完成。
- 否则,如果数组引用表达式的值为 null,则抛出 NullPointerException。
- 否则,数组引用表达式的值确实引用了一个数组。如果索引表达式的值小于零,或大于或等于数组的长度,则抛出 ArrayIndexOutOfBoundsException。
请注意,在计算索引表达式之前先计算数组引用表达式。调用索引表达式时,要评估的数组已经被评估。不用说,更改索引表达式中的数组是自找麻烦。
THE END
二维码