PMD和FindBugs有什么区别?

时间:2010-11-28 13:40:31

标签: java static-analysis findbugs pmd

有一个question comparing PMD and CheckStyle。但是,我找不到PMD和FindBugs之间差异/相似性的细分。我认为一个关键的区别是PMD适用于源代码,而FindBugs适用于编译的字节码文件。但就能力而言,它应该是一种选择还是选择,还是相互补充?

3 个答案:

答案 0 :(得分:141)

我正在使用两者。我认为它们相互补充。

如你所说,PMD适用于源代码,因此会发现以下问题:违反命名约定,缺少花括号,错误的空检查,长参数列表,不必要的构造函数,缺少交换中断等。 PMD还会告诉您代码的Cyclomatic complexity,我发现它非常有用(FindBugs没有告诉您有关Cyclomatic复杂性的信息)。

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

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

答案 1 :(得分:22)

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

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

答案 2 :(得分:3)

PMD

  • 著名
  • 在工业中广泛使用
  • 您可以在xml中添加规则
  • 为您提供错误级别和警告级别的详细分析
  • 您还可以扫描代码中的“复制和粘贴行”。重复的代码。这给出了实现java oops的好主意。