我为考试中的多项选择题生成了以下代码:

    String a = "";
    String b = null;
    String c = null;
    String d = "";
    String e = new String("");
    System.out.print((b==c) +" ");
    System.out.print((a==d) +" ");
    System.out.print((d==e) +" ");
    System.out.print((d.equals(e)) +" ");
    System.out.println(c.equals(b));

我期望的输出是:
true true false true Exception in thread "main" java.lang.NullPointerException

我收到的输出非常接近此输出,但是顺序困惑:
true true false Exception in thread "main" true java.lang.NullPointerException

它确实获得了最后一个true值,但在异常开始后得到了它。而且,尽管在某种程度上,我认为这是一个愚蠢的问题(因为代码确实做了它应该做的事情),但我不禁想知道为什么在先前命令完全终止之前会出现错误。程序执行堆栈中发生了什么事情才能使这种情况发生?

最佳答案

控制台有两个流,您的程序可将其用于输出。有“标准输出”和“标准错误”。您将消息明确地放在“标准输出”上;并且您的异常消息转到“标准错误”。

现在,尽管这两个流最终都在控制台上,但是“标准输出”的缓冲区很小。因此,要转为“标准错误”的文本可以先到达控制台的“先行”,而文本要先转入“标准输出”。

您可以通过混合调用System.out.printSystem.err.print来进行试验。

this page上有一些很好的信息。

10-06 14:12
查看更多