5

Java の catch ブロック内のステートメントの実行順序について質問があります。次のクラス Test1 (以下を参照) を実行すると、最初に Hi! が出力され、次に e.printStackTrace(); の結果が出力されると予想されます。ステートメント、そしてさようなら!しかし、私はこの注文を決して受けません。以下に貼り付けた出力を見てください。

public class Test1 {

    public static void calculate() {
        try {
             int h = 5/0; 
        } catch (ArithmeticException e) {
            System.out.println("Hi!");
            e.printStackTrace();
        } 
        System.out.println("Bye!");
    }

    public static void main(String[] args) {
        calculate();
    }

}

出力 1:

やあ!
さよなら!
java.lang.ArithmeticException: / by zero
    Test1.calculate (Test1.java:6) で
    Test1.main (Test1.java:15) で

出力 2:

java.lang.ArithmeticException: / by zero
    Test1.calculate (Test1.java:6) で
    Test1.main (Test1.java:15) で
やあ!
さよなら!

2 つの質問があります。

1.) より重要な質問: なぜ私はいつもこんにちは! そしてさようなら!コード内の mye.printStackTrace() がそれらの間にあるにもかかわらず、常に次々に印刷されますか?

2.) Hi! の前に e.printStackTrace() ステートメントの出力が表示されることがあるのはなぜですか。? プログラムを何度も実行しましたが、どのような状況でどちらの印刷が行われるのか理解できません。

ありがとうございました。

Java 6 と Eclipse (Ganymed) を使用しています。

4

5 に答える 5

19

Exception.printStackTrace()" " と " " が on であるのSystem.errに対し、は to に出力します。通常のコンソールでプログラムを実行すると、最終的には画面に表示されますが、順序が狂っている可能性があります。IDE ( NetBeansなど)を介してプログラムを実行している場合、ストリームはおそらく色分けされているため、簡単に区別できます。Hi!Bye!System.out

于 2009-02-04T18:24:27.993 に答える
7

「こんにちは!」と印刷します。と「さようなら!」へSystem.out(つまり stdout)、スタック トレースはSystem.err(つまり stderr) に出力されます。それらが出力される順序は、2 つのバッファーがいつフラッシュされるかによって決まります。

于 2009-02-04T18:25:43.187 に答える
2

タイミングの問題かもしれません。Println は標準出力に書き込みますが、printStackTrace は標準エラーに接続される場合があります。次に、どのバッファが最初にフラッシュされるかが問題になります。

于 2009-02-04T18:25:11.517 に答える
1

A1 - e.printStackTrace() は System.out ではなく System.err に出力されるため、ストリームが異なり、出力順序が異なります。

于 2009-02-04T18:26:24.870 に答える
0

すべての印刷後に System.out.flush() を追加してみてください (printStackTrace が含まれています)。

于 2009-02-04T18:25:50.690 に答える