2

私は責任記事のウィキチェーンからロガーの例を試していました。アイデアで例を実行すると、次のように出力されます。

Sending to stderr: An error has occurred.
Writing to stdout: Entering function y.
Writing to stdout: Step1 completed.
Sending via email: Step1 completed.
Writing to stdout: An error has occurred.
Sending via email: An error has occurred.

しかし、stderrs writeMessage にブレークポイントを設定すると

class StderrLogger extends Logger {
    public StderrLogger(int mask) {
        this.mask = mask;
    }

    protected void writeMessage(String msg) {
        System.err.println("Sending to stderr: " + msg);//break out here
    }
}

std err を除くすべてのメッセージを出力します。ここにはスレッドは含まれていません。では、なぜ run ケースの最初の行に stderr を出力するのでしょうか?

4

3 に答える 3

9

System.errSystem.outEclipseとは異なる方法でフラッシュします。

Eclipseでこれを試してください:

public class Derp {
    public static void main(String[] args) {
        for(int i = 0; i < 10; i++) {
            System.out.println("OUT");
            System.err.println("ERR");
        }
    }
}

OUTこれにより、ほとんどの と のほとんどがERR大きなチャンクでランダムに出力されます。ただし、Evgeniy Dorofeev が指摘したように、これは Java の問題ではなく Eclipse の問題です。

このサンプル プログラムをターミナルで実行すると、フラッシュを必要とせずに正しい出力が得られます。

更新: これを指摘してくれた Evgeniy Dorofeev に感謝します! フラッシュが機能しないのは Eclipse の問題です!

于 2013-04-26T12:19:32.430 に答える
1

System.out.println-> 出力を標準出力ストリームに送信します。通常は監視します。

System.err.println-> 出力を標準エラー ストリームに送信します。通常は監視します。

ストリームouterrは独立しています。

目的の出力を得るには、ストリームをフラッシュするか、すべての出力に 1 つのストリームのみを使用する必要があります。

コードでSystem.out.flush();andを使用できますSystem.err.flush();

于 2013-04-26T12:24:13.217 に答える
1

Eclipse から印刷している場合は、既知のバグです https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205

于 2013-04-26T12:32:35.360 に答える