我认为我对 println()
方法的概念有一点疑问。
我尝试了以下代码:
Object one = 1;
System.out.println(one);
one = "String";
System.out.println(one);
one = null;
System.out.println(one.toString()); // To explicitly throw an Exception
预期的输出是,事实上我有时会得到这个:
1
String
Exception in thread "main" java.lang.NullPointerException
at MainClass.main(MainClass.java:18) <5 internal calls>
但是运行多次,我们也可以看到以下输出:
1
Exception in thread "main" java.lang.NullPointerException
at MainClass.main(MainClass.java:18) <5 internal calls>
String
或
Exception in thread "main" java.lang.NullPointerException
at MainClass.main(MainClass.java:18) <5 internal calls>
1
String
然后,我想到了在Python中执行类似的操作。以下是片段:
var = 'Hello';
print var;
var = 6;
print var;
del var;
print var;
是的,类似的行为。无法确定回溯消息输出首选项。有时,它打印在顶部,有时打印在中间,有时打印在底部。
我认为它一定与同步
缓冲区输出有关。不确定,可能是。
谁能帮我理解这个概念?
最佳答案
这是因为您有两个输出流 System.out
和 System.err
,并且它们不协调或始终按顺序排列。
你可以做到
Object one = 1;
System.err.println(one);
Object one = "String";
System.err.println(one);
one = null;
System.out.println(one.toString());
或
Object one = 1;
System.out.println(one);
Object one = "String";
System.out.println(one);
one = null;
try {
System.out.println(one.toString());
} catch (Exception e) {
e.printStackTrace(System.out);
}
你应该做的是使用记录器。记录器将配置为将所有内容写入 System.out 或 System.err,以便您获得可预测的输出。
I think it must be something related to synchronized buffer output.
System.out
和 System.err
都是同步的。它们不使用相同的锁,因为它们不是同一个对象,但这并不重要,因为它们写入的两个流可以按任何顺序读取。
关于java - PrintStream.println() 行为 - Java/Python/任何语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36153631/