PMD和FindBugs有什么区别?

Tho*_*ens 104 java static-analysis findbugs pmd

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

sna*_*ile 146

我正在使用两者.我认为他们相互补充.

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

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

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


Dek*_*kel 22

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

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