2010-07-21 40 views
3

有些情况下,java的System.out.println将无法产生任何输出。我在一个方法里面调用了它,有时当这个方法被调用时,我得到了println和其他的我不知道的东西。System.out.println不能正常工作

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

更新:感谢您的调试帮助。原来一个阻塞的调用打开一个对话框,输出结果显然超出了正确的顺序。我认为我试图打印消息的方法在对话框关闭时被调用,但方法本身就是调用对话框的内容,所以在关闭之后它已经经过了打印输出,这是我开始寻找测试的地方。如果有人有能力删除这个问题,因为这个问题不是最初被问到的问题,这将不胜感激。

+1

您确定执行正在接触到println的调用吗?你是否将它连接到调试器以确保它被调用? – Fostah 2010-07-21 17:29:55

+0

你确定这个方法被调用吗? – Freiheit 2010-07-21 17:30:36

+1

未能写出输出,你的意思是说这个调用没有写入控制台?在这种情况下,请检查'out'流是否已被重定向。 – 2010-07-21 17:32:29

回答

1

答案按@ BalusC的suggestion--

谢谢你的帮助调试。原来一个阻塞的调用打开一个对话框,输出结果显然超出了正确的顺序。我认为我试图打印消息的方法在对话框关闭时被调用,但方法本身就是调用对话框的内容,所以在关闭之后,它已经通过了我开始寻找测试的打印输出。如果有人有能力删除这个问题,因为这个问题不是最初被问到的问题,这将不胜感激。

4

我从来没有见过这种情况。从理论上讲,当输出不在你期望的地方时,它只会“失败”。输出目标可以使用System#setOut()进行更改。

+0

是的。当我运气不好时,不得不使用在stdout或stderr上打印随机内容的可怕库,无法关闭它们,我很想做System.setOut(new PrintStream(new NullOutputStream())); (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/NullOutputStream.html),稍后重置stdout。很好的解决快速和肮脏的单线程程序。但是,如果是这样,一些图书馆正在这样做,情况就更糟了。 – 2010-07-21 17:44:07

+0

可以直接打印System.err.println(System.out);,查看自应用程序启动以来stdout是否已更改。 (如果stderr本身发生变化,当然必须在其他地方打印)。 – 2010-07-21 17:44:59

4

System.out.println在某些平台上使用缓冲输出。取决于你的代码在做什么,在程序退出之前缓冲区可能不会被刷新。尝试在println之后放System.out.flush(),看看是否有帮助。

编辑:

有时当调用方法时我得到的println和othertimes我不

你是如何验证该方法被调用,但println的不产生输出?有没有可能你的方法在获得println之前抛出一个Exception(然后吞下)?

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

+0

[code] System.out.flush(); System.out.println(“------------------------”); System.out.println(“\ n \ n :: LAT :: (”+ status +“)\ n”); System.out.println(“------------------------”); System.out.flush(); Thread.dumpStack(); [/ code] 位于方法的顶部。我知道该方法正在被调用,因为它调用的方法正在成功打印并且它们的dumpStacks()在跟踪中显示此方法 – lathomas64 2010-07-21 18:05:06

+0

这种方法是否只调用其他方法?有多个线程? Thread.dumpStack打印到System.err而不是System.out,所以除非你冲洗System.err,否则堆栈转储可能不会按照你期望的顺序。 – 2010-07-21 20:11:22

2

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

0

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

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的