当然,对错误消息或警告使用日志记录框架非常有用。但是有时候如果我想在短时间内尝试一些新的东西,我会使用System.out.println()。
使用System.out.println()进行快速测试真的很糟糕吗?
System.err.println()
,看看会发生什么。我猜该工具认为您使用System.out
的目的不正确。
当然,对错误消息或警告使用日志记录框架非常有用。但是有时候如果我想在短时间内尝试一些新的东西,我会使用System.out.println()。
使用System.out.println()进行快速测试真的很糟糕吗?
System.err.println()
,看看会发生什么。我猜该工具认为您使用System.out
的目的不正确。
Answers:
正如评论中所揭示的,真正要问的问题是,为什么静态代码分析工具会标记System.out.println的使用?
原因是在生产环境中通常不适合向stdout发送消息。如果要对库进行编码,则库应将信息返回给其调用方,而不是打印到stdout。如果您正在编写GUI应用程序,则应将信息显示给用户,而不是显示stdout指向的位置(可能不指向任何地方)。如果要对服务器(或在服务器端容器中运行的服务器)进行编码,则应使用框架提供的任何日志记录工具。依此类推。
但是,如果您使用println进行调试或开发,或者您正在编写程序并读取stdin并将其写入stdout,则println非常好。在这种情况下,它没有错。
所有stdout
被缓冲,因此它是可能的,你的程序会崩溃以后你叫println()
,但之前它到达屏幕。
话虽如此,这种情况真的不太可能。继续使用并使用它,但只需将较小的限制放在脑海中即可。
System.out
只是一个包裹BufferedOutputStream
。这可能与您将使用的任何日志记录框架相似,这些框架仅以日志输出的配置和目标形式提供更多功能。
如果您使用的是非平凡的程序,那很不好
通常,答案是“取决于”。如果您的应用程序已经有一个日志记录框架,那么您也可以使用它。它不能少有能力println()
,你可以从它提供协议栈等特点痕迹,额外的上下文,更好地格式化,等受益。日志记录框架还具有提供更好的错误恢复的独特可能性,即使在发生灾难性故障的情况下,也可以确保成功写入日志。
因此,问题就变成了何时首先添加日志记录系统。这是一个判断电话:您不想过早添加它,只是发现您确实不需要它。您也不想添加得太晚,并且要从临时解决方案转换过多的工作。
如果发现您使用进行了大量日志记录println()
,则您的代码库正在尝试告诉您它正在经历越来越大的痛苦。到那时,值得投资适当的日志记录。
我经常遇到这样的问题,即System.out.print使用“系统默认”代码页,在Linux下通常为UTF-8,而在Windows下却有些MS的东西。
根据程序的运行位置,这可能会导致unicode字符正确地显示在屏幕上。
因此,相对于System.out,我更喜欢自定义PrintWriter