System.out.println无法正常运行

时间:2010-07-21 17:27:40

标签: java blocking println

java的System.out.println无法生成任何输出的情况有哪些。我在一个方法中调用它,有时当调用该方法时,我得到println,而不是我没有。

更新:我也在println之后使用System.out.flush()。

更新:感谢您的调试帮助。事实证明,打开一个对话框的阻塞调用使输出显示出正常的顺序。我认为当对话框关闭时,我正在尝试打印消息的方法被调用,但方法本身就是调用对话框的内容,因此在关闭之后它已经超过打印输出,这是我开始寻找测试的地方。如果某人有能力删除此问题,因为问题不是最初提出的问题,我们将不胜感激。

6 个答案:

答案 0 :(得分:4)

我之前从未见过这种情况。从理论上讲,当输出不在你预期的位置时,它只会“失败”。可以使用System#setOut()更改输出目标。

答案 1 :(得分:4)

某些平台上的

System.out.println使用缓冲输出。根据您的代码执行的操作,可能在程序退出之前不刷新缓冲区。尝试在System.out.flush()之后添加println,看看是否有帮助。

修改:

  

有时当调用该方法时,我会得到println和其他的

如何验证方法是否被调用但println没有产生输出?您的方法是否有可能在它到达println之前抛出异常(然后被吞下)?

当然,看到一些实际的代码会非常有帮助。

答案 2 :(得分:2)

你在哪里检查输出?有可能System.out被重定向到其他地方,所以也许你看错了地方。

答案 3 :(得分:1)

按照@ BalusC的建议回答 -

感谢您的调试帮助。事实证明,打开一个对话框的阻塞调用使输出显示出正常的顺序。我认为当对话框关闭时,我正在尝试打印消息的方法被调用,但方法本身就是调用对话框的内容,所以在关闭之后它已经通过打印输出,这是我开始寻找测试的地方。如果某人有能力删除此问题,因为问题不是最初提出的问题,我们将不胜感激。

答案 4 :(得分:0)

System.out.println是缓冲输出,如果你不刷新缓冲区,它可能似乎“等待”直到程序结束。有时,程序可能会在刷新缓冲区之前死亡。 System.out.flush()将强制刷新输出。

答案 5 :(得分:0)

文件句柄可能已更改。即,stdout的文件描述符不再是1。我已经在日志记录实用程序中看到了这一点,人们不想去捕获任何可能打印到文件描述符的文本,因此他们只是将流重定向到打开文件的文件句柄。

这是python中的一个例子:

import sys

h = open(r"C:\foo.txt","a+")

sys.stdout = h
sys.stdout.write("hey fellas")

h.close()

在cmdline上运行此命令,您将不会按预期打印出“嘿fellas”。相反,它将被重定向到文件C:\ foo.txt