2017-10-18 116 views
5

我正在为我的程序编写测试。有时我的测试工作,有时会失败。我试图找出所有非确定性的来源。重复抛出ArrayIndexOutOfBoundsException停止生成堆栈跟踪

这里是我的问题的一个简单,独立的例子:

import java.util.ArrayList; 

public class ArrayExceptions { 
    public static void main(String[] args) { 
     final int ITERATIONS = 10000; 
     ArrayList<Integer> list = new ArrayList<>(); 
     try { 
      list.get(-1); 
     } catch(ArrayIndexOutOfBoundsException e) { 
      e.printStackTrace(); 
     } 
     for(int i = 0; i < ITERATIONS; i++) { 
      try{ 
       list.get(-1); 
      } catch (ArrayIndexOutOfBoundsException e) { 
       if(e.getMessage() == null) { 
        System.out.println(i); 
        break; 
       } 
      } 
     } 
     for(int i = 0; i < 10; i++) { 
      try { 
       list.get(-1); 
      } catch(ArrayIndexOutOfBoundsException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

这个程序创建一个ArrayList。它试图重复访问元素-1。最初,这会与ArrayIndexOutOfBoundsException一起创建详细的回溯和消息。但是,如果你调用足够多的时间(“足够”似乎大约为5500),抛出的异常缺少回溯和消息。

该程序的输出因运行而异。这早退出,在5494次迭代:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at ArrayExceptions.main(ArrayExceptions.java:8) 
5494 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 

这失败晚,在5540次迭代:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at ArrayExceptions.main(ArrayExceptions.java:8) 
5540 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 

为什么它这样做呢?

回答