重新分配不同大小的原始数组会导致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。

请注意,在计算索引表达式之前先计算数组引用表达式。调用索引表达式时,要评估的数组已经被评估。不用说,更改索引表达式中的数组是自找麻烦。


以上是重新分配不同大小的原始数组会导致ArrayIndexOutOfBoundException的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>