这有点奇怪,但代码比文字更能说明问题,所以看看测试看看我在做什么。在我当前的设置(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")]);
}
}