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

时间:2017-02-10 07:17:03

标签: java exception jvm println

我在处理我的一个小项目时发现了一些奇怪的事情:我用一些System.out.println();行来编写代码来追踪错误。奇怪的是,当我从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

而下一次可以

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)

我主要是出于对Java / JVM细节负责的好奇心以及幕后发生的事情的好奇心,但如果这件事发生在我的程序中存在一些缺陷,我想知道。

1 个答案:

答案 0 :(得分:6)

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

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