111

有一个问题比较 PMD 和 CheckStyle。但是,我无法找到关于 PMD 和 FindBugs 之间差异/相似性的很好的细分。我相信一个关键的区别是 PMD 处理源代码,而 FindBugs 处理编译的字节码文件。但就能力而言,它应该是一个非此即彼的选择,还是它们相互补充?

4

3 回答 3

159

我两个都用。我认为它们是相辅相成的。

正如您所说,PMD在源代码上工作,因此会发现以下问题:违反命名约定、缺少花括号、空检查错误、参数列表过长、不必要的构造函数、开关中缺少中断等。PMD 还告诉您有关Cyclomatic你的代码的复杂性我觉得很有帮助(FindBugs 没有告诉你循环复杂度)。

FindBugs适用于字节码。以下是 FindBugs 发现的 PMD 没有发现的一些问题:equals() 方法在子类型上失败,clone 方法可能返回 null,布尔值的引用比较,不可能的强制转换,32 位 int 移位的量不在 0-31 范围内,包含自身的集合,equals 方法总是返回 true,无限循环等。

通常他们每个人都会发现一组不同的问题。两者都用。这些工具教会了我很多关于如何编写好的 Java 代码的知识。

于 2010-11-28T15:03:12.227 回答
22

PMD 的最佳特性是其XPath Rules,它与 Rule Designer 捆绑在一起,让您可以轻松地从代码示例构建新规则(类似于 RegEx 和 XPath GUI 构建器)。FindBugs 开箱即用更强大,但构建项目特定的规则和模式非常重要。

例如,我遇到了一个涉及 2 个嵌套 for 循环的性能问题,导致运行时间为 O(n^2),这很容易避免。我使用 PMD 构建了一个ad-hoc 查询,以查看嵌套 for 循环的其他实例 - //ForStatement/Statement//ForStatement。这指出了该问题的另外 2 个实例。这不是一个通用的规则。

于 2011-08-30T20:55:23.737 回答
2

PMD 是

  • 著名的
  • 广泛应用于工业
  • 你可以在xml中添加你的规则
  • 为您提供错误级别和警告级别的详细分析
  • 您还可以扫描您的代码以获取“复制和粘贴行”。重复代码。这为实现 java oops 提供了一个好主意。
于 2015-10-29T19:10:52.693 回答