2

我的代码如下:

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)

我对么?

4

5 回答 5

2

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

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

您也可以参考这个较早的问题

前任

于 2013-01-16T06:14:27.047 回答
1

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

读这个:

将标准输出和标准错误定向到相同的目的地(例如文本终端)是可以接受的并且是正常的。除非涉及缓冲,否则消息的出现顺序与程序写入它们的顺序相同。(例如,一种常见的情况是标准错误流是无缓冲的,而标准输出流是行缓冲的;在这种情况下,如果标准输出流的缓冲区没有,则稍后写入标准错误的文本可能会更早出现在终端上。还满。)

来自维基百科

所以你的输出流(System.out.println)实际上是缓冲的。在内部它调用BufferedWriter.write()方法。看看这个: System.out.println() 如何真正起作用

于 2013-01-16T06:08:30.423 回答
1

这里至少有 2 种效果在起作用,它们都与 2 种不同流的方式System.outSystem.err(自然)有关。

缓冲

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

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

阅读那些流

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

于 2013-01-16T06:13:15.810 回答
1

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

于 2013-01-16T06:17:15.607 回答
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");
        }


}
于 2013-09-09T20:08:44.313 回答