JVM错误?Cached Object字段值导致ArrayIndexOutOfBoundsException

Seb*_*iot 7 java jvm indexoutofboundsexception

这有点奇怪,但代码说的多于单词,所以看看测试看看我在做什么.在我当前的设置(Windows 64位上的Java 7更新21)中,此测试因ArrayIndexOutOfBoundsException而失败,但是将测试方法代码替换为注释代码,它可以正常工作.我想知道Java规范中是否有任何部分可以解释原因.

在我看来,正如"michael nesterenko"建议的那样,在调用方法之前,数组字段的值被缓存在堆栈中,并且在从调用返回时不会更新.我不知道它是JVM错误还是记录在案的"优化".没有涉及多线程或"魔术".

public class TestAIOOB {
    private String[] array = new String[0];
    private int grow(final String txt) {
        final int index = array.length;
        array = Arrays.copyOf(array, index + 1);
        array[index] = txt;
        return index;
    }
    @Test
    public void testGrow() {
        //final int index = grow("test");
        //System.out.println(array[index]);
        System.out.println(array[grow("test")]);
    }
}
Run Code Online (Sandbox Code Playgroud)

ama*_*loy 6

这由Java语言规范很好地定义:评估x[y],首先x评估,然后y评估.在您的情况下,x评估String[]为零元素.然后,y修改成员变量,并求值为0.尝试访问已返回的数组的第0个元素失败.事实上,该成员array的变化对数组查找没有关系,因为我们正在寻找的String[]array在我们评估它的时候引用.