java - PrintStream.println() 行为 - Java/Python/任何语言

标签 java python

我认为我对 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.outSystem.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.outSystem.err 都是同步的。它们不使用相同的锁,因为它们不是同一个对象,但这并不重要,因为它们写入的两个流可以按任何顺序读取。

关于java - PrintStream.println() 行为 - Java/Python/任何语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36153631/

相关文章:

java - 使用导入的 XSD 和绑定(bind)生成 JAXB 类

java异常

python - 同时为两个或更多小部件提供悬停效果?

python - Pandas 错误 : “pandas. libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20477)

python - 按位或 "|"与 Python 中两个正幂的加法 "+"

java - PCM 字节数组加法

java - 如何给tomcat服务器上的最大物理可用内存?

java - 正确呈现指向使用破折号而不是括号和逗号的外部 html javadoc 文档的 javadoc 方法链接

python - 我的神经网络没有提高其准确性

python - 在 sqlalchemy 查询中使用 jsonb_array_elements