2016-05-13 26 views
1

爲什麼不輸出以正確的順序進行下面的測試代碼:在Eclipse(Java)的控制檯不輸出的東西在正確的/時間順序

public static void main(String[] args) { 

    boolean test = false; 

    try { 
     assert test: "will fail with -ea enabled in VM args" ; 
    } catch (AssertionError e) { 
     e.printStackTrace(); 
     System.out.println("idk why you would use this but..."); 
    } 

    System.out.println(test + " sneaks in between"); 

} 

來看,這種以「-ea」啓用在VM參數(運行配置)

隨機

的輸出可以是:

java.lang.AssertionError: will fail with -ea enabled in VM args 
    at Main.main(Main.java:31) 
FOO 
BAR 

(正常情況)或:

java.lang.AssertionError: ERROR 
FOO 
BAR 
    at Main.main(Main.java:31) 

(不應發生),有時:

java.lang.AssertionError: ERROR 
FOO 
    at Main.main(Main.java:31) 
BAR 

我與瞎搞 「斷言」 當發生這種情況。我知道代碼是完全廢話,但它也可能發生在其他設置。Seconldy控制檯在許多程序中並沒有真正用於官方,主要用於調試。但它仍然很奇怪。

這是因爲try catch在不同的線程上運行?還是在彼此之後發生的事情發生得如此之快,以至於有一件事在另一件事之前推出?

我注意到添加一個Thread.sleep(1); (需要拋出或抓住) 的確使它總是按時間順序排列,所以...

爲什麼不按時間順序打印代碼?

回答

1

printStackTrace()打印到錯誤 out。如何按照時間順序排列與標準出是不確定的。您可以嘗試撥打 System.out,但我無法向您保證結果會像您期望的那樣,除非您使用其他可用方法之一專門將堆棧跟蹤打印到標準輸出。

+0

是的,當使用e.printStackTrace(System.out)指定PrintStream時,我得到了正確的結果; (除了文本不是紅色的) – AgentM

+0

也我猜:http://stackoverflow.com/questions/6121786/java-synchronizing-standard-out-and-standard-error然後也回答它, (編輯)請注意,我不知道printStackTrace()使用System.err輸出流,我甚至都沒有想過。 – AgentM

相關問題