2010-07-21 41 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的