Java 重新分配具有不同大小的基元数组会导致ArrayIndexOutOfBoundException
为什么上面的代码会给出ArrayIndexOutOfBoundsException,而:Java 重新分配具有不同大小的基元数组会导致ArrayIndexOutOfBoundException,java,arrays,Java,Arrays,为什么上面的代码会给出ArrayIndexOutOfBoundsException,而: static int[] array = new int[1]; static int fun() { array = new int[10]; return 3; } public static void main(String[] args) { array[fun()] = 2; } 没有 谢谢。这是由于运行
static int[] array = new int[1];
static int fun() {
array = new int[10];
return 3;
}
public static void main(String[] args) {
array[fun()] = 2;
}
没有
谢谢。这是由于运行时评估阵列访问的方式造成的,如中所述: 在运行时,数组访问表达式的求值行为如下:
- 首先,对数组引用表达式求值。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成,并且不会计算索引表达式
- 否则,将计算索引表达式。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成
- 否则,如果数组引用表达式的值为null,则会引发NullPointerException
- 否则,数组引用表达式的值实际上引用数组。如果索引表达式的值小于零,或大于或等于数组的长度,则会引发ArrayIndexOutOfBoundsException
请注意,数组引用表达式是在计算索引表达式之前计算的。在调用索引表达式时,要对其求值的数组已经求值。不用说,在索引表达式中更改数组会带来麻烦。这是由于运行时评估数组访问的方式造成的,如中所述: 在运行时,数组访问表达式的求值行为如下:
- 首先,对数组引用表达式求值。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成,并且不会计算索引表达式
- 否则,将计算索引表达式。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成
- 否则,如果数组引用表达式的值为null,则会引发NullPointerException
- 否则,数组引用表达式的值实际上引用数组。如果索引表达式的值小于零,或大于或等于数组的长度,则会引发ArrayIndexOutOfBoundsException
public static void main(String[] args) {
fun();
array[3] = 2;
}