调试:到System.out.println()或不到System.out.println()

时间:2011-01-04 00:20:52

标签: java debugging

这是我的问题。更具体地说,我正在尝试习惯Eclipse的调试器,我想知道在某些情况下打印到控制台是否仍然完成,或者它是否被认为是一种应该完全避免的不良做法。还有什么可以被认为是整体调试的好方法?

5 个答案:

答案 0 :(得分:10)

改为使用System.err.println()

为什么?

System.out.println()经常被重定向到文件或其他输出,而这几乎总是打印在控制台上。它更容易调试,也是正确的方法。


编辑(警告:主观):

因为您询问是否应该完全避免System.out.println:我不相信任何您必须始终避免,无论是否使用goto,使用BSOD或其他任何东西使计算机崩溃。有时你只需要一种快速而又肮脏的方式来快速完成小事情,而且只需要不值得你需要花费1小时才能尝试“正确” “方式,而不是5分钟的修复,无论”好“的方式有多好。在决定是否应该使用某些内容时使用您的判断,但从不为自己设置规则,例如“我永远使用goto!”。 :)

编辑2(示例):

假设您正在调试崩溃的驱动程序,并且您怀疑正在执行不应执行的if语句。不要花费三个小时查找如何使用ZwRaiseHardError来显示消息框,而只需在KeBugCheck内调用if并使darned系统崩溃。当然,你会重新启动,但除非重启需要几个小时,否则你只需要节省很多时间。

答案 1 :(得分:6)

最好的选择是日志库(当然,这会为您的项目增加额外的依赖性)。例如,查看commons-logging。 主要优点是您可以在DEBUG级别编写调试消息,并且在部署代码时,您只需将记录器配置为跳过这些消息(而不是在代码中搜索所有出现的System.out.println) 。 另一个很大的优点是记录器通常可以配置为在任何地方写入(甚至发送电子邮件或短信),而无需触及您的代码。

答案 2 :(得分:2)

  1. 小点:如果您的程序实际上通过System.out向控制台输出了一些有用的东西,您可能希望将调试信息打印到System.err

  2. 您通常应该尽可能多地进行调试(理想情况下使用一些标准记录器,如log4j)。这既可以在您实际开发程序时简化调试,又可以更轻松地调试生产中已发布的代码。好处是你的代码保持不变,你不需要ADD debugf打印,但默认情况下,日志配置可以关闭日志记录,直到它实际需要(或至少调低日志级别)

    < / LI>
  3. 就一般简单的“在墙上抛出println”调试来说,它有时可能是最快的调试方式之一,尽管它绝不应该是唯一的/主要的。

    为什么它有用?还有其他原因,因为在调试器中运行Java程序可能比它外部慢得多;或者因为你的bug出现在Eclipse调试器中无法轻易复制的环境/情况中。

答案 3 :(得分:1)

如果在修复bug之后调试打印行不会留在代码中,那么就做最简单的事情。 Lambert使用System.err.println()的建议是一个好主意,因为您可以将它与程序可能产生的其他输出区分开来。如果调试打印行将保留在您的代码中,那么我建议使用log4j之类的日志框架。这样,您可以根据您是在尝试调试某些内容还是仅在生产中运行来上下调整输出级别。使用log4j时,请务必输出正确的级别。不要只记录INFO的所有内容。

答案 4 :(得分:0)

我使用System.out.println进行调试,以防我遇到问题或通知我方法已经开始确保一切正常,但是当我发布程序时,我总是将其删除,因为它会减慢程序的速度