重复抛出 ArrayIndexOutOfBoundsException 停止产生堆栈跟踪
Repeatedly thrown ArrayIndexOutOfBoundsException stop producing stack traces
我正在为我的程序编写测试。有时我的测试有效,有时失败。我正在尝试追踪不确定性的所有来源。
这是我的问题的一个简单、独立的示例:
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 旁边创建一个详细的回溯和一条消息。但是,如果您调用它的次数足够多(其中 'enough' 似乎约为 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
为什么要这样做?
没关系,想通了。
将 -XX:-OmitStackTraceInFastThrow
作为命令行选项传递给 JVM 以关闭此行为。另见 NullPointerException stack trace not available without debug agent
我正在为我的程序编写测试。有时我的测试有效,有时失败。我正在尝试追踪不确定性的所有来源。
这是我的问题的一个简单、独立的示例:
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 旁边创建一个详细的回溯和一条消息。但是,如果您调用它的次数足够多(其中 'enough' 似乎约为 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
为什么要这样做?
没关系,想通了。
将 -XX:-OmitStackTraceInFastThrow
作为命令行选项传递给 JVM 以关闭此行为。另见 NullPointerException stack trace not available without debug agent