为什么Exception和println()行每次都以不同的顺序出现在同一个程序中?

Sar*_*on1 -1 java jvm exception println

我在处理我的一个小项目时发现了一些奇怪的事情:我用一些代码来编写代码System.out.println();来追踪一个bug.奇怪的是,当我从IDE运行错误程序时,Exception堆栈跟踪的行和一些打印语句的打印输出在每次运行程序时以不同的顺序出现.常识将规定同一程序每次都以相同的方式运行,包括例外,因此所有执行的输出也必须相同.然而,这种情况并非如此.线条的内容保持不变,并且堆栈跟踪线和打印输出线的顺序保持一致,但每次都会混合不同.所以在一次运行中,控制台输出是

populatePinArrays: An input pin added to gate!
populatePinArrays: An input pin added to gate!
populatePinArrays: An output pin added to gate!
Exception in thread "main" java.lang.NullPointerException
    at Gates.Pin.isReadyToEvaluate(Pin.java:28)
    at Gates.Pin.evaluate(Pin.java:19)
    at Gates.TheCircuit.evaluateTheCircuit(TheCircuit.java:42)
    at main.Main.main(Main.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
CircEval: all set to dirty
CircEval: all input pins set to clean
Run Code Online (Sandbox Code Playgroud)

而下一次它可以

Exception in thread "main" populatePinArrays: An input pin added to gate!
populatePinArrays: An input pin added to gate!
java.lang.NullPointerException
populatePinArrays: An output pin added to gate!
CircEval: all set to dirty
CircEval: all input pins set to clean
    at Gates.Pin.isReadyToEvaluate(Pin.java:28)
    at Gates.Pin.evaluate(Pin.java:19)
    at Gates.TheCircuit.evaluateTheCircuit(TheCircuit.java:42)
    at main.Main.main(Main.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Run Code Online (Sandbox Code Playgroud)

我主要是想要了解Java/JVM的细节是什么以及究竟发生了什么,但如果这件事发生在我的程序中有些缺陷,我想知道.

Kay*_*man 6

写入异常堆栈跟踪,stderr而写入正常输出stdout.它们最终都在同一个地方(在这种情况下,并非总是如此),但由于它们不是同一个流,因此它们可能以完全不同的方式交错.

如果您要将System.out.printlns 转换为System.err.printlns(或将堆栈跟踪打印到stdout e.printStackTrace(System.out);),您会发现这种情况不再发生.