随着软件产品的逐渐增多,使用客户越来越多,对产品质量要求也随之提高。因此,希望所有开发人员从细微处着手,对自己书写的代码进行认真仔细地检查;这里 ,推荐一款eclipse插件FindBugs,它的作用是对开发人员书写的代码进行静态检查,在开发环境规避掉因代码书写bug从而造成的生产环境问题。
FindBugs:是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用 Visitor 模式来鉴别代码是否符合一些固定的规范。
3 FindBugs安装及使用
3.1.1 插件安装
3.1.2 代码检查
3.2 Jenkins集成
(1) Jenkins安装findbugs插件
选择插件管理
(2) pom.xml中配置findbugs插件
以下为具体的配置信息。
<groupId>org.codehaus.mojo</groupId>
<version>2.5.2</version>
<findbugsXmlOutput>true</findbugsXmlOutput>
<xmlOutput>true</xmlOutput>
</plugin>
(4) 验证findbugs的安装。
参考资料:https://wiki.jenkins-ci.org/display/JENKINS/FindBugs+Plugin
根据Bug可能导致的后果,FindBugs定义了若干Bug级别,主要的级别如下所示:
Correctness: 正确性
Malicious code vulnerability: 存在漏洞的有害代码
Performance:性能
Dodgy: 欺骗性代码
a) 不需要处理
描述:调用set方法,修改对象属性,被修改的对象属性是一个可变的对象;
描述:调用get方法,获得对象属性,获得的对象属性是一个可变的对象;
Dead store to local variable
处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉;
描述:调用的方法中不会抛出异常,但是调用方法的时候尝试使用try catch捕获异常;
Unread field
处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉,和Dead store to local variable一样处理,只是这里针对的是不是局部变量;
描述:调用静态的DateFormat对象
Class is Serializable, but doesn't define serialVersionUID
处理方式:自动生成serialVersionUID;
描述:Field一直被设置为null;
Usage of GetResource may be unsafe if class is extended
处理方式:
描述:非同步的get方法,同步的set方法
Unconditional wait
处理方式:
描述:switch语句中有case没有使用break;
Should be a static inner class
处理方式: 增加static修饰符使其成为静态内部类;
描述:私有方法没有被调用;
c) 必须处理
描述:对String对象调用toString方法;
Inefficient use of keySet iterator instead of entrySet iterator
处理方式:使用迭代器迭代Collection的时候,优先使用entrySet;
描述:对已知为null的对象进行一些操作,例如
已知ids为空了,但是还调用ids.length属性,应该将&&修改为||;
Method invokes inefficient Number constructor; use static valueOf instead
处理方式:在将一个String对象转化为对应的Number对象的时候,通常会使用new Long(stringObj);实际上使用Long.valueOf(stringObj)会更好;
描述:对已知为null的对象进行一些操作,例如
已知ids为空了,但是还调用ids.length属性,应该将&&修改为||;
Equals method should not assume anything about the type of its argument
处理方式:通常在调用Class.isInstance去判断对象的相等性的时候会出现;
描述:某些字段应该是final的,但是不是;
Write to static field from instance method
处理方式:避免在实例方法中对静态变量做修改;
描述:未被用到的字段;
Nullcheck of value previously dereferenced
处理方式:在这里不需要进行空置检查;
描述:if else 两个分支执行同样的代码;
Method might ignore exception
处理方式:对异常的处理作出检查,这样的情况通常出现在如下代码:
Try{ }catch(Exception r){ }。

