反复抛出ArrayIndexOutOfBoundsException停止生成堆栈跟踪

Nic*_*ell 5 java exception stack-trace

我正在为我的程序编写测试.有时我的测试工作,有时他们失败了.我试图追查所有非确定性的来源.

这是一个简单,自包含的问题示例:

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序创建一个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
Run Code Online (Sandbox Code Playgroud)

这里失败很晚,在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
Run Code Online (Sandbox Code Playgroud)

为什么这样做?

Nic*_*ell 5

没关系,想通了.

通过-XX:-OmitStackTraceInFastThrow作为命令行选项的JVM来关闭该行为.另请参见NullPointerException堆栈跟踪在没有调试代理的情况下不可用