簡體   English   中英

調試:到System.out.println()或不到System.out.println()

[英]Debugging: to System.out.println() or to not System.out.println()

這是我的問題。 更具體地說,我正在嘗試習慣Eclipse的調試器,我想知道在某些情況下打印到控制台是否仍然完成,或者它是否被認為是一種應該完全避免的不良做法。 還有什么可以被認為是整體調試的好方法?

請改用System.err.println()

為什么?

System.out.println()經常被重定向到一個文件或另一個輸出,而這幾乎總是打印在控制台上。 它更容易調試,也是正確的方法。


編輯(警告:主觀):

因為你詢問是否應該完全避免使用System.out.println :我不相信你必須經常避免的任何事情 ,無論是使用goto,使用BSOD使你的計算機崩潰,還是其他什么。 有時你只需要一種快速而又骯臟的方式來快速完成小事情,而且很明顯,你花費1小時就不值得嘗試以“正確”的方式做事,而不是5 - 無論多么好的“好”方式,都能解決問題。 在決定是否應該使用某些東西時使用你的判斷,但從不為自己設定規則,比如“我永遠不會使用goto!”。 :)

編輯2(示例):

假設您正在調試崩潰的驅動程序,並且您懷疑正在執行不應執行的if語句。 而不是花費三個小時來找出如何使用ZwRaiseHardError來顯示消息框,只需在if調用KeBugCheck並使darned系統崩潰。 當然,你會重新啟動,但除非重啟需要幾個小時,否則你只需要節省很多時間。

最好的選擇是日志庫(當然,這會為您的項目增加額外的依賴性)。 例如,查看commons-logging。 主要優點是您可以在DEBUG級別編寫調試消息,並且在部署代碼時,您只需將記錄器配置為跳過這些消息(而不是在代碼中搜索所有出現的System.out.println) 。 另一個很大的優點是記錄器通常可以配置為在任何地方寫入(甚至發送電子郵件或SMS),而無需觸及您的代碼。

  1. 小點:如果你的程序實際上通過System.out向控制台輸出了一些有用的東西,你可能想要將調試信息打印到System.err

  2. 您通常應該盡可能多地進行調試(理想情況下使用一些標准記錄器,如log4j )。 這既可以在您實際開發程序時簡化調試,又可以更輕松地調試生產中已發布的代碼。 好處是你的代碼保持不變,你不需要ADD debugf打印,但默認情況下,日志配置可以關閉日志記錄,直到實際需要(或至少調低日志級別)

  3. 至於一般簡單的“在牆上拋出println ”調試,它有時可能是最快的調試方式之一,盡管它絕不應該是唯一的/主要的。

    它為什么有用? 還有其他原因,因為在調試器中運行Java程序可能比它外部慢得多; 或者因為您的錯誤表現在Eclipse調試器中無法輕松復制的環境/情境中。

如果在修復bug之后調試打印行不會留在代碼中,那么就做最簡單的事情。 Lambert使用System.err.println()的建議是一個好主意,因為您可以將它與程序可能產生的其他輸出區分開來。 如果調試打印行將保留在您的代碼中,那么我建議使用log4j之類的日志框架。 這樣,您可以根據您是在嘗試調試某些內容還是僅在生產中運行來上下調整輸出級別。 使用log4j時,請務必輸出正確的級別。 不要只記錄INFO的所有內容。

我使用System.out.println進行調試,以防我遇到問題或通知我方法已經開始確保一切正常,但是當我發布程序時,我總是刪除它,因為它會減慢程序的速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM