2017-02-10 14 views
-1

작은 프로젝트에서 작업하는 동안 이상한 것을 발견했습니다. 버그를 추적하기 위해 코드에 System.out.println(); 줄을 썼습니다. 이상하게도 IDE에서 버그가있는 프로그램을 실행할 때 Exception stacktrace의 행과 그 print 문 중 일부의 인쇄물이 프로그램이 실행될 때마다 다른 순서로 나옵니다. 상식은 동일한 프로그램이 매번 같은 방식으로 실행되도록 지정합니다 (예외가 포함되므로 모든 실행에 대해 출력도 동일해야합니다). 그러나 이것은 사실이 아닙니다. 선의 내용은 동일하게 유지되며 스택 추적 선과 인쇄 선의 순서는 동일하게 유지되지만 매번 다르게 혼합됩니다. 다음 시간이 될 수 있지만 그래서 하나 실행에, 콘솔 출력은Exception과 println() 행이 같은 프로그램에 대해 매번 다른 순서로 나오는 이유는 무엇입니까?

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) 

내가 주로 자바/JVM의 본격 비교 책임이며, 정확히 무엇에 대한 호기심 부탁 해요 후드 아래에서 일어나는 일이지만,이 문제가 내 프로그램에서 몇 가지 결함을 지적한다면, 나는 알고 싶습니다.

+0

코드가 귀하의 질문과 관련이 있다고 생각하지 않습니까? – shmosel

+1

"상식은 동일한 프로그램이 매번 같은 방식으로 실행되도록 지시합니다. 예외는 포함됩니다." 상식일지도 모르지만, 프로그래머는 그 사실이 사실임을 확실히 알고 있습니다. – Kayaman

+0

상식은 서로 다른 시간대에 두 가지 스트림을 플러시 할 수 있도록 지시합니다. ;) –

답변

6

예외 스택 트레이스는 stderr으로 작성되고 일반 출력은 stdout으로 작성됩니다. 둘 다 같은 위치에 있습니다 (이 경우 항상 그렇지는 않음). 그러나 동일한 스트림이 아니기 때문에 서로 다른 방식으로 인터리브 할 수 있습니다.

System.out.printlnSystem.err.println으로 변환하거나 stacktrace를 e.printStackTrace(System.out);과 함께 stdout으로 인쇄하면 더 이상 발생하지 않습니다.