4

使用此代码:

class SimpleException extends Exception {}

public class SimpleExceptionDemo {

  public void f() throws SimpleException {
    System.out.println("Throw SimpleException from f()");
    throw new SimpleException();
  }
  public static void main(String[] args) {
    SimpleExceptionDemo sed = new SimpleExceptionDemo();
    try {
      sed.f();
    } catch(SimpleException e) {
      System.err.println("Caught it!");
    }

  }
}

在某些情况下,我有这个输出:

Caught it!
Throw SimpleException from f()

你知道为什么在“caught it”之后会打印“Throw SimpleException from f()”吗?

4

4 回答 4

8

您正在两个不同的输出流上打印:

System.out.println("Throw SimpleException from f()");

System.err.println("Caught it!");

不能保证从两个不同的流中出现的消息的顺序...使用相同的流,就可以了。

如果您对此类问题感兴趣,请继续阅读

于 2013-09-20T09:55:37.057 回答
7

System.err并且System.out是不同的流,因此一个输出可能出现在另一个之前。

如果你只使用一个,那么它的顺序是正确的。

于 2013-09-20T09:56:03.187 回答
2

您正在打印您的例外以进行System.err流式传输。其余的输出到System.out. 这两个是不同的系统流,每个都有自己的缓冲区和时间,但默认情况下,具有共同的接收端 - 控制台。

问题是,这两个流中的缓冲区不同步,因此不能保证这两个流将按照您指定的顺序输出。

您可以通过在打印后调用来强制流立即输出flush()

于 2013-09-20T09:57:56.470 回答
1

因为您正在写入两个不同的流 - System.out 和 System.Err。将两者写入相同,然后您将获得所需的顺序。

于 2013-09-20T09:56:27.907 回答