当我在java中启动我的个性化异常时,为什么解析器不';你不按照我的代码顺序做吗?
使用此代码:当我在java中启动我的个性化异常时,为什么解析器不';你不按照我的代码顺序做吗?,java,Java,使用此代码: 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
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()
您知道为什么在“捕获它”之后会打印“Throw SimpleException from f()”?您正在两个不同的输出流上打印:
System.out.println("Throw SimpleException from f()");
及
来自两个不同流的消息的顺序不保证。。。使用相同的流,就可以了
如果你对这些问题感兴趣,读一下可能会很有趣
System.err
和System.out
是不同的流,因此一个流的输出可能出现在另一个流之前
如果只使用一个,则顺序正确。因为您正在写入两个不同的流-System.out和System.Err。将这两个文件写入同一个文件,然后您将按照您想要的顺序获得。您正在将异常打印到
System.err
流中。其余的输出转到System.out
。这两个是不同的系统流,每个流都有自己的缓冲区和定时,但默认情况下,它们有共同的接收端——控制台
问题是,这两个流中的缓冲区是不同步的,因此不能保证这两个流会按照指定的顺序输出
您可以在打印后通过调用
flush()
立即强制流输出。您还可以看到转换错误消息,例如空指针异常的堆栈跟踪可以与发送到System.out lines的内容交错扔,而不是发射。
System.err.println("Caught it!");