为什么System.out.println不好?

时间:2013-10-29 11:01:07

标签: pmd

当我运行我的PMD插件时,他们说System.out.println已被使用。为什么System.out.println使用不好,使用PMD插件时是否有缺陷?什么是超越这个的替代方式?

5 个答案:

答案 0 :(得分:6)

可以使用配置打开/关闭记录器,但不能使用System.out.println。重要的是,记录器提供不同级别的日志记录,并且可以通过配置文件再次进行控制。

同样使用记录器,您可以配置旋转,清除等但不能对sysout执行相同操作。这在生产环境中很常用,执行大量代码并生成大量日志记录。

答案 1 :(得分:4)

System.out.println ..

  

通常用于调试目的,可以保留在   代码库甚至在生产代码中。通过使用记录器可以   随意启用/禁用此行为(并按优先级)并避免   堵塞标准输出日志。

(来自SourceMeter Java user guide“Java日志规则”)

需要导入(.jar)

Logger site

示例:

import org.apache.log4j.Logger;

class Foo{
    private static final Logger LOG = Logger.getLogger(Foo.class);
    public void testA () {
        System.out.println("Entering test");
        // Better use this
        LOG.info("Entering test");
    }
} 

答案 2 :(得分:2)

System.out.println()被视为记录的不良做法 因为

  • 无法转动它(ON / OFF
  • 无法设置输出等级(TRACEDEBUGINFOWARNERROR),
    无需重新编译代码

另一个缺点是程序的标准输出可以被重定向,例如,并不总是清楚输出实际到达的位置,例如,如果你这样做:

java SomeClass > someFile

在这种情况下,使用日志API将对您有所帮助。

但是在某些情况下你真的想要将某些内容打印到标准输出上,因为有java.io.Console的情况无法重定向,所以如果你正在运行命令行java程序,它会给出你相信用户正在看到他们想要的消息。

答案 3 :(得分:1)

这是因为,PMD定义了一个名为SystemPrintln的java日志记录规则,它在代码中检测System.out.println并将其视为缺陷。

自:PMD 2.1

使用系统。(out | err).print,考虑使用记录器。

此规则由以下XPath表达式定义:

//Name[
    starts-with(@Image, 'System.out.print')
    or
    starts-with(@Image, 'System.err.print')
    ]

你应该能够修改上面的XPath表达式来覆盖行为(我不确定) 以下链接应该为您提供更多见解,

http://pmd.sourceforge.net/pmd-4.2.6/rules/logging-java.html

答案 4 :(得分:0)

将过量的数据打印到System.out可能会成为性能瓶颈,因为它是同步的,来自PrintStream的代码:

public void println(float x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}