繁体   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