java的代码检查插件介绍与使用
一:代码分析工具介绍
现有4种主流java静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest)。参见: 常用 Java 静态代码分析工具的分析与比较,有比较全面的分析,现摘录一部分以作备份。
1.1 静态代码分析工具简介
1.1.1 什么是静态代码分析
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
1.1.2 静态代码分析工具的优势
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
二.主流分析工具的比较分析
三. 主流java静态分析工具之checkstyle
Checkstyle 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。
Checkstyle 提供了支持大多数常见 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下图 1 所示,Checkstyle 对代码进行编码风格检查,并将检查结果显示在 Problems 视图中。图中,代码编辑器中每个放大镜图标表示一个 Checkstyle 找到的代码缺陷。开发人员可通过在 Problems 视图中查看错误或警告详细信息。
checkstyle 在eclipse的安装:
checkstyle的更新源地址:http://eclipse-cs.sf.net/update/,也可以从http://sourceforge.net/projects/eclipse-cs/files/ 下载最新的插件包本地进行安装
安装后的Preferences的显示是
在你需要进行Checkstyle的项目上单击右键,选择properties。在弹出的对话框中选择Checkstyle项目,如果需要Checkstyle的时候就勾选上左上角的复选框,不需要的时候反之即可。在此界面你还可以选择代码规范,并且对相应的代码规范进行配置。显示如下:
Checkstyle的内置编程规范:
- Javadoc 注释:检查类及方法的 Javadoc 注释
- 命名约定:检查命名是否符合命名规范
- 标题:检查文件是否以某些行开头
- Import 语句:检查 Import 语句是否符合定义规范
- 代码块大小,即检查类、方法等代码块的行数
- 空白:检查空白符,如 tab,回车符等
- 修饰符:修饰符号的检查,如修饰符的定义顺序
- 块:检查是否有空块或无效块
- 代码问题:检查重复代码,条件判断,魔数等问题
- 类设计:检查类的定义是否符合规范,如构造函数的定义等问题
checkstyle常见错误解释:
序号 输出内容意义
序号 | 输出内容意义 |
1. Type is missing a javadoc commentClass | 缺少类型说明 |
2.“{” should be on the previous line | “{” 应该位于前一行 |
3. Methos is missing a javadoc comment | 方法前面缺少javadoc注释 |
4. Expected @throws tag for “Exception” | 在注释中希望有@throws的说明 |
5. “.” Is preceeded with whitespace | “.” 前面不能有空格 |
6. “.” Is followed by whitespace | “.” 后面不能有空格 |
7. “=” is not preceeded with whitespace | “=” 前面缺少空格 |
8. “=” is not followed with whitespace | “=” 后面缺少空格 |
9. “}” should be on the same line | “}” 应该与下条语句位于同一行 |
10. Unused @param tag for “unused” | 没有参数“unused”,不需注释 |
11. Variable “CA” missing javadoc | 变量“CA”缺少javadoc注释 |
12. Line longer than 80characters | 行长度超过80 |
13. Line contains a tab character | 行含有”tab” 字符 |
14. Redundant “Public” modifier | 冗余的“public” modifier |
15. Final modifier out of order with the JSL suggestion | Final modifier的顺序错误 |
16. Avoid using the “.*” form of importImport | 格式避免使用“.*” |
17. Redundant import from the same package | 从同一个包中Import内容 |
18. Unused import-java.util.listImport | 进来的java.util.list没有被使用 |
19. Duplicate import to line 13 | 重复Import同一个内容 |
20. Import from illegal package | 从非法包中 Import内容 |
21.“while” construct must use “{}” | “while” 语句缺少“{}” |
22. Variable “sTest1” must be private and have accessor method | 变量“sTest1”应该是private的,并且有调用它的方法 |
23. Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$” | 变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$” |
24.“(” is followed by whitespace | “(” 后面不能有空格 |
25.“)” is proceeded by whitespace | “)” 前面不能有空格 |
参考网站: