PMD和FindBugs有哪些区别?

114

有一个关于PMD和CheckStyle的比较问题。然而,我找不到一份详细说明PMD和FindBugs之间差异/相似性的好资料。我认为一个主要区别是,PMD适用于源代码,而FindBugs适用于编译后的字节码文件。但就功能而言,它们应该是二选一还是互补的?

3个回答

161

我同时使用这两个工具,我认为它们相辅相成。

正如你所说,PMD 作用于源代码,因此会发现以下问题:命名规范的违反、大括号缺失、空指针检查不当、参数列表过长、不必要的构造函数、switch语句中缺少break等。PMD还会告诉你代码的圈复杂度,我觉得这非常有帮助(FindBugs没有圈复杂度的信息)。

FindBugs 作用于字节码。下面是FindBugs能够发现而PMD不能的一些问题:equals() 方法对子类型无效、克隆方法可能返回null、Boolean值的引用比较、无法转换、32位整数位移量超出0-31的范围、包含自身的集合、equals方法总是返回true、无限循环等。

通常每个工具会发现不同的问题。建议同时使用这两个工具,它们教会了我如何编写良好的Java代码。


当一个集合包含它本身时,您看到的具体错误代码是什么,并且为什么FindBugs将其标记为可能是bug? - Geek
自从Sonarqube 6.3以后,它不再支持Java 7,现在需要Java 8,并且Findbugs仅支持Java 7。 - Markus

22

PMD最好的特点是其XPath规则,配备了规则设计器,让您可以轻松地从代码样本中构建新规则(类似于RegEx和XPath图形界面构建器)。

FindBugs在开箱即用方面更强大,但构建项目特定规则和模式非常重要。

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


2

PMD是一个广泛应用于IT技术行业的著名工具。

  • 你可以通过xml添加自定义规则。
  • 该工具提供了详细的错误级别和警告级别分析。
  • 你还可以扫描代码中的“复制粘贴行”,重复代码。这有助于实现Java面向对象编程思想。

不要将其与FindBugs相混淆;它们是互补的,因为它们的问题集不完全相同。 - Stevers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接