2016-05-13 11 views
1

なぜ次のテストコードのための正しい順序で出力されません:有効「-ea」との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"); 

} 

実行これを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()エラーが出力されます。どのように年代順に並んで標準出力は不確定です。 flush()System.outに電話してみることもできますが、使用可能な他の方法の1つを使用してスタックトレースを標準出力に印刷しない限り、結果が期待どおりになることは保証できません。

+0

はい、e.printStackTrace(System.out)を使用してPrintStreamを指定すると正しい結果が得られます。 (テキストが赤でないことを除いて) – AgentM

+0

私も推測します:http://stackoverflow.com/questions/6121786/java-synchronizing-standard-out-and-standard-errorそれでは答えても、 (編集)note I printStackTrace()がSystem.err出力ストリームを使用していることを知らなかったので、私はそれについても考えませんでした。 – AgentM

関連する問題