Java 重新分配具有不同大小的基元数组会导致ArrayIndexOutOfBoundException

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; } 没有 谢谢。这是由于运行

为什么上面的代码会给出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;
    }
没有


谢谢。

这是由于运行时评估阵列访问的方式造成的,如中所述:

在运行时,数组访问表达式的求值行为如下:

  • 首先,对数组引用表达式求值。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成,并且不会计算索引表达式
  • 否则,将计算索引表达式。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成
  • 否则,如果数组引用表达式的值为null,则会引发NullPointerException
  • 否则,数组引用表达式的值实际上引用数组。如果索引表达式的值小于零,或大于或等于数组的长度,则会引发ArrayIndexOutOfBoundsException

请注意,数组引用表达式是在计算索引表达式之前计算的。在调用索引表达式时,要对其求值的数组已经求值。不用说,在索引表达式中更改数组会带来麻烦。

这是由于运行时评估数组访问的方式造成的,如中所述:

在运行时,数组访问表达式的求值行为如下:

  • 首先,对数组引用表达式求值。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成,并且不会计算索引表达式
  • 否则,将计算索引表达式。如果此计算突然完成,则阵列访问也会因为相同的原因突然完成
  • 否则,如果数组引用表达式的值为null,则会引发NullPointerException
  • 否则,数组引用表达式的值实际上引用数组。如果索引表达式的值小于零,或大于或等于数组的长度,则会引发ArrayIndexOutOfBoundsException
请注意,数组引用表达式是在计算索引表达式之前计算的。在调用索引表达式时,要对其求值的数组已经求值。不用说,在索引表达式中更改数组会带来麻烦

    public static void main(String[] args) {
    fun();  
    array[3] = 2;
    }