




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CheckStyle 、FindBugs和PMD一、 三个插件的安装方法一:1. Eclipse中,选择Help->Install New Software2.点击Add来新增一个安装 3.输入安装名称和地址a) CheckStyle: b) Findbugs:/eclipsec) PMD:如果安装地址不对,会报错,如下图:如果安装地址正确,如下:4. 安装后重启即可 5.安装好之后,右击项目选择属性,可以看到安装是否成功方法二:1.下载eclipse插件下载后,把里面的两个文件夹plugins和 features下面
2、的文件分别拷贝到eclipse目录下面对应的plugins和features目录2.如果你就这样直接启动eclipse 可能会出现ClassNotFoundExceptions 等错误,所以必须在启动eclipse的时候加上一个参数 -clean. 这样eclipse就可以更新它当前安装的许多插件信息比如你得eclipse在d盘 那么就是 d:eclipseeclipse.exe -clean二、 CheckStyle的介绍和使用1、 介绍 Checkstyle是一款检查java程序代码样式的工具,可以有效的帮助我们检视代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一
3、。Checkstyle提供了高可配置性,以便适用于各种代码规范,所以除了可以使用它提供的sun的代码标准外,你也可以定制自己的标准。我们可以在eclipse中安装checkstyle的插件,来方便我们的使用。 Checkstyle可以让我们养成书写良好代码风格的习惯,代码的整洁也减少了很多bad smell的产生。使用checkstyle的过程中可能需要经常的调整配置文件,有些check过于严格,可以根据实际情况取消一些代码检查。2、 使用2.1CheckStyle使用样例I配置好项目的checkstyle属性II .右击项目,点击Checkstyle中的Check code with Che
4、ckstyle选择某个项目,点击右键选择“Checkstyle”,会出现如下菜单:1) Configure project(s) from blueprint:指定工程加入Checkstyle检查;2) Activate Checkstyle:激活Checkstyle;3) Deactivate Checkstyle:取消激活Checkstyle;4) Check code with Checkstyle:使用Checkstyle检查代码;5) Clear Checkstyle violations:去掉Checkstyle的检查提示。6) Create Formatter-Profile:创
5、建格式化文件。III .运行结果选择“Check code with Checkstyle”对所选中的项目进行检查,检查后对有问题的类会使用警告或错误标识。参考提示信息如下: 左侧会显示小圆圈,将鼠标移动到上面时将给出提示信息。 使用Checkstyle后,注释、变量命名规范性、类中变量、构造函数、方法的顺序的检查、行的长度、文件的长度、方法的长度等都不需要手工进行检查,只
6、需要在代码评审时使用Checkstyle检查即可。因此,让代码评审人员将侧重点放在Checkstyle检查不出来的一些代码的优化问题。IIII . 自己添加规则新建一个文本文档,保存为xml格式,写入如下内容:在项目的Checkstyle属性里,添加自己的规则:选择使用自己的规则:选中自己的规则:重新运行Check code with Checkstyle:可以看到,当我定义规则if层次最大为3时,如果代码的if层次超过了3,则会提示错误。IIV .Checkstyle violations chart视图点击Windows的Perferences下的other项,选中Checkstyle中的
7、Checkstyle violations chart:选择Checksty violations chart视图,会把每种不规范的信息做下统计,绘制成图表:2.2CheckStyle常见错误提醒错误提示错误说明missing a javadoc comment缺少类注释Line longer than X characters行长度超过X个字符(包括空格)Return count is X(max allowed 3)一个方法内的返回数量是X(最大值只能为3)Nested if-else depth is X(max allowed is 3)最大的if-else嵌套层数为X(最大只能为3)
8、Array brackets at illegal position数组的方括号“”的位置不正确(检查数组类型的定义是String args,而不是String args)Line matchs the illegal pattern 'System.out.println'本行包含System.out.println语句ctor def modifier at indentation level 8 not at corrent indentation 4缩进不正确,一般是因为没有在Eclipse中使用4个空格代替tab键引起。'static' modifie
9、r out of order with the JLS suggestionsstatic修饰符没有按照JLS的建议来排序(eg.写成public final static.应该改成public static final)Name 'X' must match pattern 'A-ZA-Z0-9_A-Z0-9+$'(正则表达式)名称不符合正则表达式'A-ZA-Z0-9_A-Z0-9+$'(即为大写字母,数字、下划线等)。一般在静态变量没有大写时提示,包名不是全部消息时提示,类名不是大写开头时提示,方法名不是小写开头时提示Variable acc
10、ess definition in wrong order变量定义顺序不正确(例如在类成员变量定义时,将private类型的变量定义在public类型的变量之前)Static variable definition in wrong order静态变量定义顺序不正确(例如在构造函数之后定义静态变量)Instance variable definition in wrong order成员变量定义顺序不正确(例如在构造函数之后定义成员变量)X is a magic numberX是一个魔术数字(非0、1、2的数字)if construct must use ''if结构必须使用&
11、#39;'Got an exception - Unexpected character 0xfffd in identifier因为没有设置checkstyle配置文件的charset为UTF-8,而类文件使用UTF-8编码,并且含有中文“” should be on the previous line“” 应该位于前一行Methods is missing a javadoc comment方法前面缺少javadoc注释Expected throws tag for “Exception”在注释中希望有throws的说明“.” Is prec
12、eeded with whitespace“.” 前面不能有空格“.” Is followed by whitespace“.” 后面不能有空格“=” is not preceeded with whitespace“=”前面缺少空格“=” is not followed with whitespace“=” 后面缺少空格“” should be on the same line“” 应该与下条语句位于同一行Unused param tag for “unused”没有参数“unused”,不需注释Var
13、iable “X” missing javadoc变量“CA”缺少javadoc注释Line contains a tab character行含有”tab” 字符Redundant “Public” modifier冗余的“public” modifierfinal modifier out of order with the JSL suggestionfinal修饰符的顺序错误Avoid using the “.*” form of importImport格式避免使用“.*”Redundant import
14、 from the same package从同一个包中Import内容Unused import-X Importimport的X类没有被使用Duplicate import to line X重复Import同一个内容Import from illegal package从非法包中 Import内容“while” construct must use “”“while” 语句缺少“”Variable “X” must be private and have accessor method变量“X”应该是private的,
15、并且有调用它的方法Variable “X” must match pattern “a-za-zA-Z0-9*$”变量“X”不符合命名规则“a-za-zA-Z0-9*$”“(” is followed by whitespace“(” 后面不能有空格“)” is proceeded by whitespace“)” 前面不能有空格2.3CheckStyle默认提供的检查内容Javadoc注释 命名约定 标题 Import语句 体积大小 空白 修饰符 块&
16、#160;代码问题 类设计 混合检查(包活一些有用的比如非必须的 System.out和printstackTrace) 从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范 的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。三、 FindBugs的介绍和使用1、 介绍Findbugs是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意Findbugs是检查java字节码,也就是*.class文件。其实准确的
17、说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的null check,多余的 null check,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"=",建议使用StringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。2、 使用2.1 Findbugs使用样例I. 同样先设置项目的FindBugs属性当运行插件没有反应的时候,可能是Mi
18、nimum confidence to report 属性设置问题,这个属性是设置报错等级的,如果设置为Medium,那么Low级别的错误则不会提示。a. Run FindBugs Automatically开关当此项选中后,FindBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FindBugs就会运行,并将相应的信息显示出来。当此项没有选中,你只能每次在需要的时候自己去运行FindBugs来检查你的代码。b. Minimum priority to report选择项这个选择项是让你选择哪个级别的信息进行显示,有Low、Medi
19、um、High三个选择项可以选择,很类似于Log4J的级别设置啦。 比如:你选择了High选择项,那么只有是High级别的提示信息才会被显示。你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。你选择了Low选择项,那么所有级别的提示信息都会被显示。c. Enable bug categories选择项在这里是一些显示Bug分类的选择:Correctness关于代码正确性相关方面的Performance关于代码性能相关方面的Internationalization关于代码国际化相关方面的Multithreaded correctness关于代码多线程正确性相关
20、方面的Style关于代码样式相关方面的Malicious code vulnerability关于恶意破坏代码相关方面的比如:如果你把Style的检查框去掉不选择中它,那么与Style分类相关的警告信息就不会显示了。其它的类似。d. Select bug patterns to check for选择项在这里你可以选择所要进行检查的相关的Bug Pattern条目可以从Bug codes、Detector name、Detector description中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的检查条件。II. 右击项目选择Find Bugs的FindBugs选择项目
21、,点击右键选择“Checkstyle”,会出现如下菜单:1) Find Bugs:使用Findbugs代码中的错误;2) Clear Bug Markers:清除bug 标记;3) Save XML:保存XML;4) Open Analysis Results in Editor:在编辑器中打开分析结果;5) Load XML:下载XML。III. 运行结果项目和文件后面括号中的数字代表其包含的错误数,在Java文件中,编辑框边上的绿色瓢虫代表了低级错误,鼠标放在上面会提示错误具体信息,同时也可右击瓢虫,选择show bug info 来查看具体错误信息。IV. Bugs Info、Bugs
22、Explorer和Bugs Reviewer同样在Windows的Show View中可以调出Bugs Info、Bugs Explorer和Bugs Reviewer工具调,可以方便查看错误信息。 2.2 错误详细说明Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种 Internationalization,12种Malicious code vulnerability,27种Multithreaded correctness,
23、23种Performance,43种Dodgy。Bad practice 坏的实践一些不好的实践,下面列举几个:HE: 类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()。SQL:Statement 的execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。DE: 方法终止或不处理异
24、常,一般情况下,异常应该被处理或报告,或被方法抛出。Correctness 一般的正确性问题可能导致错误的代码,下面列举几个:NP: 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为NonNull的null参数;方法的返回值声明为NonNull实际是null。Nm: 类定义了hashcode()方法,但实际上并未覆盖父类Object的hashCode();类定义了tostring()方法,但实际上并未覆盖父类Object的toString();很明显的方法和构造器混淆;方法名容易混淆
25、。SQL:方法尝试访问一个Prepared Statement的0索引;方法尝试访问一个ResultSet的0索引。UwF:所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。Internationalization 国际化当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。Malicious code vulnerability 可能受到的恶意攻击如果代码公开,可能受到恶意攻击的代码,下面列举几个:FI: 一个类的finalize()应该是protected,而不是public的。MS:
26、属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。Multithreaded correctness 多线程的正确性多线程编程时,可能导致错误的代码,下面列举几个:ESync:空的同步块,很难被正确使用。MWN:错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的使用wait()。No: 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。SC: 构造器调用了Thread.start(),当该类被继承可能会导致错误。Performance 性能问题可能导致性能
27、不佳的代码,下面列举几个:DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf();用类似Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。SIC:如果一个内部类想在更广泛的地方被引用,它应该声明为static。SS: 如果一个实例属性不被读取,考虑声明为static。UrF:如果一个属性从没有被read,考虑从类中去掉。UuF:如果一个属性从没有被使用,考虑从类中去掉。Dodgy 危险的具有潜在危险的代码,可能运行期产生错误,下面列举几个:CI:
28、类声明为final但声明了protected的属性。DLS:对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。ICAST: 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。INT:没必要的整型数字比较,如X <= Integer.MAX_VALUE。NP: 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。REC:直接捕获Exception,而实际上可能是RuntimeException。ST: 从实例方法里直接修改类变量,即static属性。 四、 PMD的介绍和使用1、
29、 介绍PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCC和EBNF(扩展巴科斯-诺尔范式,Extended Backus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(AST,Abstract Syntax Tree)。从根本上看,Java源代码只是一些普通的文本。不过,为了让解析器承认这些普通的文本是合法的Java代码,它们必须符合某种特定的结构要求。这种结构可以用一种称为EBNF的句法元语言
30、表示,通常称为“语法” (Grammar)。JavaCC根据语法要求生成解析器,这个解析器就可以用于解析用Java编程语言编写的程序。 不过实际运行 中的PMD还要经过JJTree的一次转换。JJTree是一个JavaCC的插件,通过AST扩充JavaCC生成的解析器。AST是一个Java符号 流之上的语义层。有了JJTree,语法分析的结果不再是“System, ., out, ., . println”之类的符号序列,而是一个由对象构成的树型层次结构。2、 使用2.1 PMD使用样例I. 配置项目属性,选择Enable PMDII. 右击项目,选择PMD中的Check Code选
31、择项目,点击右键选择“PMD”,会出现如下菜单:1) Generate Reports:生成报告2) Clear Violation Reviews:清除违反检查3) Find Suspect Cut And Paste:查找可能的剪切粘贴4) Clear Violations:清除违反5) Check Code:检查代码III. 运行结果运行完后,会有一个违反大纲:右击每条违反都可以查看具体违反的规则,例如查看第一条具体信息:IV. 在Windows 的show view 中调出Dataflow View通过Dataflow View 可以查看整段代码的结构:V. 右击一个类文件,选择Gen
32、erate Abstract Syntax Tree可以生成这个类文件的抽象语法树:2.2PMD 规则说明PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:基本(rulesets/basic.xml) 规则的一个基本合集,可能大多数开发人员都不认同它: catch 块不该为空,无论何时重写 equals(),都要重写 hashCode(),等等。命名(rulesets/naming.xml) 对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。未使用的代码(rule
33、sets/unusedcode.xml) 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。 设计(rulesets/design.xml) 检查各种设计良好的原则,例如: switch 语句应当有 default 块,应当避免深度嵌套的 if 块,不应当给参数重新赋值,不应该对 double 值进行相等比较。 导入语句(rulesets/imports.xml) 检查 import 语句的问题,比如同一个类被导入两次或者被导入 java.lang 的类中。 JUnit 测试(rulesets/junit.xml) 查找测试用例和测试方法的特定问题,例如方法名称的正确
34、拼写,以及 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() 方法不是那么普遍(我上次编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海西蒙古族藏族自治州天峻县2025年数学五年级第二学期期末监测模拟试题含答案
- 贵州电子商务职业技术学院《EDA技术》2023-2024学年第二学期期末试卷
- 安徽现代信息工程职业学院《中国古代文学史(1)》2023-2024学年第二学期期末试卷
- 山东省潍坊市临朐一中2025年高三下学期第三次验收物理试题理试卷含解析
- 黑龙江东方学院《商务数据分析》2023-2024学年第二学期期末试卷
- 阀岛箱:现代工业中的气动控制核心
- 广州城市职业学院《画法几何与建筑制图》2023-2024学年第二学期期末试卷
- 共享职工之家建设存在问题和原因以及对策建议
- 美容院环境满意度调查
- 抗滑桩工程施工方案
- DL-T5706-2014火力发电工程施工组织设计导则
- (高清版)JTGT 3365-05-2022 公路装配式混凝土桥梁设计规范
- 《民航客舱设备操作与管理》课件-项目二 客舱服务设备
- JT-T 1495-2024 公路水运危险性较大工程专项施工方案编制审查规程
- 03 写景状物文章-2023-2024学年五年级语文阅读专项试题(统编版) 教师版2
- 普通外科临床路径(2019年版)
- 孕产妇健康知识讲座活动总结
- 天猫店铺规划方案
- 中国古代文学的人文关怀与社会责任
- 饰面人造板产品质量
- 北京市校外教育机构工作规程实施细则
评论
0/150
提交评论