代码之家  ›  专栏  ›  技术社区  ›  Nick ODell

重复抛出ArrayIndexOutOfBoundsException停止生成堆栈跟踪[重复]

  •  5
  • Nick ODell  · 技术社区  · 7 年前

    我正在为我的程序编写测试。有时我的测试有效,有时失败。我正在努力寻找不确定性的所有来源。

    下面是我的问题的一个简单、独立的示例:

    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
    

    它为什么这样做?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Nick ODell    7 年前

    算了,算了吧。

    通过 -XX:-OmitStackTraceInFastThrow 作为JVM的命令行选项来关闭此行为。另请参见 NullPointerException stack trace not available without debug agent