我在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?
答案 0 :(得分: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");
}
}
}
这会随机打印大部分OUT
和大部分ERR
s。然而,正如Evgeniy Dorofeev所指出的,这是一个Eclipse问题,而不是Java问题。
如果您在终端中运行此示例程序,您将注意到正确的输出,无需任何刷新。
更新: 感谢Evgeniy Dorofeev指出这一点! 刷新不起作用是一个Eclipse问题!
答案 1 :(得分:1)
System.out.println
- &gt;将输出发送到标准输出流。一般监控。
System.err.println
- &gt;将输出发送到标准错误流。一般监控。
流out
和err
是独立的。
要获得所需的输出,您必须刷新流或只使用一个流进行所有输出。
您可以在代码中使用System.out.flush();
和System.err.flush();
答案 2 :(得分:1)
如果您从Eclipse打印它,那就是一个已知错误https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205