2

次のコードを実行すると、2つの結果が得られます。

 package scjp;

    public class ExceptionTest {

        public static void main(String[] args) {
            ExceptionTest test = new ExceptionTest();
            test.method1();
        }

        public void method1() {
            try {
                System.out.println("Try Block");

                if (!true) {
                    return;
                } else {
                    throw new RuntimeException();
                }
            }finally {
                System.out.println("Finally Block");
            }
        }
    }

1つの結果は

Try Block
Exception in thread "main" java.lang.RuntimeException
    at scjp.ExceptionTest.method1(ExceptionTest.java:17)
    at scjp.ExceptionTest.main(ExceptionTest.java:7)
Finally Block

そして他の、

Try Block
Finally Block
Exception in thread "main" java.lang.RuntimeException
    at scjp.ExceptionTest.method1(ExceptionTest.java:17)
    at scjp.ExceptionTest.main(ExceptionTest.java:7)

上記のコードを実行するたびに、答えは変わります。私の理解では、それは常に同じ結果でなければなりません。何か手伝ってくれませんか?

4

2 に答える 2

5

システムエラー出力ストリーム(上記のスタックトレース、コンソールでは赤で表示されている可能性があります)は、システム出力ストリーム(System.out.println()ステートメント)とは異なります。したがって、両方のストリームがコンソールに書き込むため、エラーメッセージは通常のコンソール出力と同期しない可能性がありますが、互いに独立しています。違いは次のとおりです。

System.out.println("Some text");

アウトストリームに出力

System.err.println("Error occurred!");

エラーストリームに出力します

同じコンソールに出力する場合、2つが混ざり合う可能性があります。

于 2013-02-28T11:28:42.323 に答える
0

例外スタックトレースは同じoutputstreanに出力されず(System.errに出力されます)、System.errとSystem.outは同期されません。

常に同じ出力を得るには、System.outではなくSystem.errにメッセージを出力できます。

于 2013-02-28T11:31:59.003 に答える