我的代码如下:
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)
我说错了吗?
答案 0 :(得分:2)
一个原因可能是异常堆栈跟踪使用standard error (System.err)
在System.out.println
使用standard output (System.out)
时输出错误数据。
这意味着两者都使用不同的机制来输出数据,这些可能无法正确同步。
您也可以参考此earlier question。
离
答案 1 :(得分:1)
输出和错误是两个不同的流System.err
和System.out
。
阅读本文:
标准输出和标准错误是可接受的 - 也是正常的 被定向到相同的目的地,例如文本终端。 消息的显示顺序与程序写入的顺序相同,除非 涉及缓冲。 (例如,常见的情况是 标准错误流是无缓冲的,但标准输出流是 行缓冲;在这种情况下,稍后写入标准错误的文本可以 如果标准输出流的缓冲区出现在早期的终端 尚未满。)
来自wikipeda
所以你的输出流(System.out.println)实际上是缓冲的。在内部,它会调用BufferedWriter.write()
方法。看看这个:
How System.out.println() really works
答案 2 :(得分:1)
这里至少有2种效果,都与System.out
和System.err
(自然)2种不同的流有关。
System.err
和System.out
都是PrintStream,默认情况下是缓冲的,但System.err
通常设置为每次写入后自动刷新(字节数组或每当换行时)写)。
因此,如果在System.err
被刷新之前刷新System.out
,它将首先出现在屏幕上。
在编辑器中,System.out
和System.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");
}
}