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

Jam*_* P. 4 java debugging

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

Meh*_*dad 10

System.err.println()改用.

为什么?

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


编辑(警告:主观):

因为你问过是否System.out.println应该完全避免:我不相信你必须经常避免的任何事情,无论是使用goto,使用BSOD使计算机崩溃,还是其他什么.有时你只需要一种快速而又肮脏的方式来快速完成小事情,而且很明显,你花费1小时就不值得尝试以"正确"的方式做事,而不是5 - 无论多么好的"好"方式,都能解决问题.在决定是否应该使用某些东西时使用你的判断,但从不为自己设定规则,比如"我永远不会使用goto!".:)

编辑2(示例):

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

  • @Falmarri:如果我花了10多分钟来调试一段5分钟的代码,我只需要以正确的方式切换,而不是花费6个小时修复它.但是如果你花了1个小时来弄清楚如何以"正确"的方式显示错误,如果你可以在30秒内完成'println`并退出,并且完成你的工作,我也会感到非常*抱歉. 5分钟.(我会抱怨-1,但是再说一次,这个*是*意见,所以请随意不同意.):) (5认同)
  • -1用于花5分钟编写一个hack而不是1个小时来正确写入并节省6个小时的调试时间. (2认同)

Cos*_*atu 6

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