2

我正在尝试来自wiki责任链文章的Logger 示例。在它打印的想法中运行示例:

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 之外的所有消息,这里没有涉及线程,那么为什么它在运行案例的第一行打印 stderr?

4

3 回答 3

9

System.err与 Eclipse 中的刷新方式不同System.out

在 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");
        }
    }
}

这将随机打印出大部分OUTs 和大部分ERRs 大块。然而,正如 Evgeniy Dorofeev 所指出的,这是一个 Eclipse 问题,而不是 Java 问题。

如果您在终端中运行此示例程序,您会注意到正确的输出,而无需任何刷新。

更新:感谢 Evgeniy Dorofeev 指出这一点!冲洗不起作用是 Eclipse 问题!

于 2013-04-26T12:19:32.430 回答
1

如果您从 Eclipse 打印它,这是一个已知的错误 https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205

于 2013-04-26T12:32:35.360 回答
1

System.out.println-> 将输出发送到标准输出流。一般监控。

System.err.println-> 将输出发送到标准错误流。一般监控。

outerr是独立的。

要获得所需的输出,您必须刷新流或仅使用一个流进行所有输出。

您可以在代码中使用System.out.flush();System.err.flush();

于 2013-04-26T12:24:13.217 回答