当我运行我的PMD插件时,他们说使用了System.out.println
。为什么System.out.println
不好用,是使用PMD插件时的缺陷吗?还有什么可以替代这种方式呢?为什么System.out.println不好?
回答
的System.out.println ..
通常用于调试的目的,甚至可以在生产代码留在 代码库。通过使用记录器,可以根据意愿(和优先级)启用/禁用此行为,并避免 堵塞标准输出日志。
(从SourceMeter Java user guide下 “Java记录规则”)
导入需要(的.jar)
实施例:
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");
}
}
使用配置可以开启/关闭记录器,但不能使用System.out.println
。重要的是,记录器提供不同级别的记录,并且可以通过配置文件再次进行控制。
此外使用记录器,您可以配置旋转,清除等,但不能对sysout执行相同的操作。这在生产环境中尤其有用,执行大量代码并生成大量日志记录。
CLI应用程序怎么样?通常输出到标准输出。这是这些类型的应用程序的正常输出。 –
@TulainsCórdova在CLI应用程序中,您可以使用宏或简单的if/else来决定日志或不根据运行时参数进行日志记录 –
我的意思是,如果System.out.println()被取消,那么意味着什么CLI应用程序写入屏幕? –
由于无法打开/关闭,设置输出级别(TRACE,DEBUG,INFO,WARN,ERROR)等,而无需重新编译代码,System.out被认为是日志记录的不良做法。另一个缺点是,一个程序的标准输出可以重定向,例如,如果你做到这一点并不总是很清楚,其中输出实际上是去,例如:
java SomeClass > someFile
在这种情况下使用的日志记录API将帮助你。
但也有,你真的要打印的东西到标准输出也为这些场合有java.io.Console,它不能被重定向的情况,因此,如果你正在运行一个命令行Java程序,它让你确信用户正在看到打算给他们的信息。
CLI应用程序的正常输出如何?这些应用程序通常写入标准输出,这不被视为日志记录。 –
为此,请使用System.console(),因为它允许您确定是否在终端中,以及它更适合用户使用。 – chaos
在Eclipse中我运行了''''''''''''''''''''' Doc说:“如果没有控制台设备可用,那么对该方法的调用将返回空值。”_ –
印刷过量的成到System.out可以从为PrintStream成为性能瓶颈,因为它是同步的,代码:
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}
这是因为,PMD定义了名为SystemPrintln
一个java日志记录规则,其检测在System.out.println
代码并将其视为缺陷。
由于:PMD 2.1
系统(出|错误).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
- 1. 为什么System.out.println(super)不允许?
- 2. 什么是System.out.println()
- 3. 为什么System.out.println(+ c1)和System.out.println(“c1”= + c1)的区别?
- 4. 为什么在System.out.println之前打印System.err.println?
- 5. 为什么System.out.println(0_101);打印65?
- 6. 找不到为什么System.out.println不起作用
- 7. 为什么globals不好?
- 8. 为什么这不好?
- 9. 为什么performSelector:onThread:不好?
- 10. 为什么require_once不好用?
- 11. 为什么#define不好?
- 12. 为什么seq不好?
- 13. System.out.println()不抛出异常,但System.in.read()抛出异常,为什么?
- 14. 为什么System.out.println()在Netbeans 6.8中不起作用?
- 15. 为什么我的Java代码不执行System.out.println?
- 16. System.out.println(“abc”+ 3 + 2);为什么输出是abc32而不是abc5?
- 17. 为什么数据为中心不好?
- 18. 为什么Sass好?
- 19. 为什么LuaJIT这么好?
- 20. 什么是'不可验证的代码',为什么它不好?
- 21. Pro Android 2:Android中的system.out.println是什么?
- 22. 我该写什么下来的System.out.println
- 23. SYSO(System.out.println())的作用是什么?
- 24. 为什么我的Scanner变量不能转换为双精度型:System.out.println(inputR.nextDouble());?
- 25. 为什么这些枚举不好
- 26. 为什么静态变量不好?
- 27. UnnecessaryLocalBefore返回 - 为什么它不好?
- 28. 为什么追加到列表不好?
- 29. 为什么DKIM不好签名
- 30. 为什么改变原型(js)不好?
的[记录器对的System.out.println(http://stackoverflow.com/questions/2750346/logger-vs-system-out-println) – jontro
可能重复它是如何一个缺陷?你需要更具体一点。 –
这是一个缺陷,因为您启用了一个检查'System.out.println()'的规则。您可以使用以下页面中介绍的方法在您认为需要输出的地方抑制警告:http://pmd.sourceforge.net/pmd-5.0.5/suppressing.html。 –