异常输出不按顺序排列

时间:2013-01-16 06:02:14

标签: java core

我的代码如下:

public class BoxingUnboxingExample {
    public static void main(String[] args) {
        Integer i1 = null;
        Integer i3 = 10;
        BoxingUnboxingExample b = new BoxingUnboxingExample();
        b.go(i3);
        b.go(i1);
    }
    private void go(int a){
        System.out.println("a");
    }
}

现在我的问题是:

有时我会收到以下错误消息,

Exception in thread "main" java.lang.NullPointerException
at scjp.wraperExample.BoxingUnboxingExample.main(BoxingUnboxingExample.java:12)
a

然而,我认为它应该始终如下,

a
Exception in thread "main" java.lang.NullPointerException
at scjp.wraperExample.BoxingUnboxingExample.main(BoxingUnboxingExample.java:12)

我说错了吗?

5 个答案:

答案 0 :(得分:2)

一个原因可能是异常堆栈跟踪使用standard error (System.err)System.out.println使用standard output (System.out)时输出错误数据。

这意味着两者都使用不同的机制来输出数据,这些可能无法正确同步。

您也可以参考此earlier question

答案 1 :(得分:1)

输出和错误是两个不同的流System.errSystem.out

阅读本文:

  

标准输出和标准错误是可接受的 - 也是正常的   被定向到相同的目的地,例如文本终端。   消息的显示顺序与程序写入的顺序相同,除非   涉及缓冲。 (例如,常见的情况是   标准错误流是无缓冲的,但标准输出流是   行缓冲;在这种情况下,稍后写入标准错误的文本可以   如果标准输出流的缓冲区出现在​​早期的终端   尚未满。)

来自wikipeda

所以你的输出流(System.out.println)实际上是缓冲的。在内部,它会调用BufferedWriter.write()方法。看看这个: How System.out.println() really works

答案 2 :(得分:1)

这里至少有2种效果,都与System.outSystem.err(自然)2种不同的流有关。

缓冲

System.errSystem.out都是PrintStream,默认情况下是缓冲的,但System.err通常设置为每次写入后自动刷新(字节数组或每当换行时)写)。

因此,如果在System.err被刷新之前刷新System.out,它将首先出现在屏幕上。

读取这些流

在编辑器中,System.outSystem.err在单个控制台中显示的情况并不少见。发生这种情况的方式将影响它们的显示顺序。 Eclipse有两个进程,每个进程一个,从流中读取并显示它们。它们读取的顺序(以及显示)是非确定性的。如果两个流都是准同时写入的,那么从System.err读取的进程将有50%的机会成为第一个接收输入的人。因此,它们可能看起来是随机交错的。

答案 3 :(得分:1)

如果您在Eclipse中,这是一个已知问题,请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205

答案 4 :(得分:0)

public class Main {

        public static void main(String[] args) {
            System.setErr(System.out); // this line seems to solve the problem
            System.out.println("test");

            throw new RuntimeException("Test");
        }


}