4

在哪些情况下 java 的 System.out.println 无法产生任何输出。我在方法内部调用了它,有时当调用该方法时,我得到了 println,而有时我没有。

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

更新:感谢您的调试帮助。事实证明,打开对话框的阻塞调用导致输出出现严重错误的顺序。我以为我试图打印消息的方法在对话框关闭时被调用,但方法本身就是调用对话框的方法,所以在关闭后它已经超过了我开始寻找测试的打印输出。如果有人能够删除此问题,因为该问题不是最初提出的问题,我们将不胜感激。

4

6 回答 6

5

System.out.println在某些平台上使用缓冲输出。根据您的代码正在执行的操作,可能在程序退出之前未刷新缓冲区。尝试System.out.flush()在你println的 s 之后放置,看看是否有帮助。

编辑:

有时,当调用该方法时,我会得到 println,而有时却没有

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

当然,查看一些实际代码会很有帮助。

于 2010-07-21T17:30:19.860 回答
4

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

于 2010-07-21T17:29:49.933 回答
2

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

于 2010-07-21T17:31:14.867 回答
1

按照@BalusC的建议回答——

感谢您的调试帮助。事实证明,打开对话框的阻塞调用导致输出出现严重错误的顺序。我认为我试图打印消息的方法在对话框关闭时被调用,但方法本身就是调用对话框的方法,所以在关闭后它已经通过了我开始寻找测试的打印输出。如果有人能够删除此问题,因为该问题不是最初提出的问题,我们将不胜感激。

于 2010-07-22T15:39:28.080 回答
0

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

于 2010-07-21T17:31:52.583 回答
0

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

这是python中的一个例子:

import sys

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

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

h.close()

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

于 2010-07-21T17:38:34.700 回答