一、概述
PMD(Project Manager Design)是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题。此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。
PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCC和EBNF(扩展巴科斯-诺尔范式,Extended Backus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(AST,Abstract Syntax Tree)。
PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。
二、官方地址
地址:http://pmd.sourceforge.net/pmd-5.0.0/
三、使用
1、安装
File→setting→plugins→pmd
安装即可
2、安装重启后
右键Run PMD → Pre Defined→All即可
3、可用的规则集
PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:
- 基本(rulesets/basic.xml)—— 规则的一个基本合集,可能大多数开发人员都不认同它:
catch
块不该为空,无论何时重写equals()
,都要重写hashCode()
,等等。 - 命名(rulesets/naming.xml)—— 对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
- 未使用的代码(rulesets/unusedcode.xml)—— 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
- 设计(rulesets/design.xml)—— 检查各种设计良好的原则,例如:
switch
语句应当有default
块,应当避免深度嵌套的if
块,不应当给参数重新赋值,不应该对 double 值进行相等比较。 - 导入语句(rulesets/imports.xml)—— 检查 import 语句的问题,比如同一个类被导入两次或者被导入
java.lang
的类中。 - JUnit 测试(rulesets/junit.xml)—— 查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及
suite()
方法是不是 static 和 public。 - 字符串(rulesets/string.xml)—— 找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用
String
构造函数,对String
变量调用toString()
方法。 - 括号(rulesets/braces.xml)—— 检查
for
、if
、while
和else
语句是否使用了括号。 - 代码尺寸(rulesets/codesize.xml)—— 测试过长的方法、有太多方法的类以及重构方面的类似问题。
- Javabean(rulesets/javabeans.xml)—— 查看 JavaBean 组件是否违反 JavaBean 编码规范,比如没有序列化的 bean 类。
- 终结函数(finalizer)—— 因为在 Java 语言中,
finalize()
方法不是那么普遍(我上次编写这个代码也经是好多年前的事了),所以它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找finalize()
方法的各种问题,例如空的终结函数,调用其他方法的finalize()
方法,对finalize()
的显式调用,等等。 - 克隆(rulesets/clone.xml)—— 用于
clone()
方法的新规则。凡是重写clone()
方法的类都必须实现Cloneable
,clone()
方法应该调用super.clone()
,而clone()
方法应该声明抛出CloneNotSupportedException
异常,即使实际上没有抛出异常,也要如此。 - 耦合(rulesets/coupling.xml)—— 查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
- 严格的异常(rulesets/strictexception.xml)—— 针对异常的测试:不应该声明该方法而抛出
java.lang.Exception
异常,不应当将异常用于流控制,不应该捕获Throwable
,等等。 - 有争议的(rulesets/controversial.xml)—— PMD 的有些规则是有能力的 Java 程序员可以接受的。但还是有一些争议。这个规则集包含一些更有问题的检验,其中包括把 null 赋值给变量、方法中有多个返回点,以及从
sun
包导入等。 - 日志(rulesets/logging-java.xml)—— 查找
java.util.logging.Logger
的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。