FindBugs实践

FindBugs实践

1、        Bug级别

根据Bug可能导致的后果,FindBugs定义了若干Bug级别,主要的级别如下所示:

Bad Practice: 不好的实践

Correctness: 正确性

Experimental Internationalization:

Malicious code vulnerability: 存在漏洞的有害代码

Multithreaded correctness: 多线程正确性

Performance:性能

Security:安全

Dodgy: 欺骗性代码

 

2、        常见Bug以及处理办法

a)       不需要处理

May expose internalrepresentation by incorporating reference to mutable object

描述:调用set方法,修改对象属性,被修改的对象属性是一个可变的对象;

May expose internalrepresentation by returning reference to mutable object

描述:调用get方法,获得对象属性,获得的对象属性是一个可变的对象;

b)       建议处理

Dead store to localvariable

描述:对一个局部变量赋值,但是这个局部变量可能不会被用到;

处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉;

Exception is caughtwhen Exception is not thrown

描述:调用的方法中不会抛出异常,但是调用方法的时候尝试使用try catch           捕获异常;

处理方式:确认此方法的调用会不会导致异常的发生,如果不会抛出异常请去      trycatch,确认方法调用会不会抛出异常关键是对方法调用参数的合法       性进行检查,排除调用这个方法时可能抛出异常的参数;

Unread field

描述:某个对象的属性不会被读取

处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉,和      Dead store to local variable一样处理,只是这里针对的是不是局部变量;

Call to staticDateFormat

描述:调用静态的DateFormat对象

处理方式:DateFormat对象是线程不安全的,建议不要使用静态的DateFormat,但是DateFormat不会被修改的话,也可以不用修改;

 

 

Class is Serializable,but doesn't define serialVersionUID

描述:类是可序列化的,但是没有定义serialVersionUID

处理方式:自动生成serialVersionUID

Field only ever set tonull

描述:Field一直被设置为null

处理方式:检查相关filed的调用情况,看所有对Field的操作是否都是将Field设置为null

Usage of GetResourcemay be unsafe if class is extended

描述:如果一个类被继承了,使用getResource可能会不安全

处理方式:

Unsynchronized getmethod, synchronized set method

描述:非同步的get方法,同步的set方法

处理方式:修改为一致的情况

Unconditional wait

描述:无条件的wait

处理方式:

Switch statement foundwhere one case falls through to the next case

描述:switch语句中有case没有使用break

处理方式:增加break

Should be a staticinner class

描述:应该是静态内部类;

处理方式:增加static修饰符使其成为静态内部类;

Private method isnever called

描述:私有方法没有被调用;

处理方式:考虑将其注释掉;

c)       必须处理

Method invokestoString() method on a String

描述:String对象调用toString方法;

处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉;

Inefficient use ofkeySet iterator instead of entrySet iterator

描述:在遍历Collection对象的时候,使用entrySet的性能会比keySet性能高;

处理方式:使用迭代器迭代Collection的时候,优先使用entrySet

Load of known nullvalue

描述:对已知为null的对象进行一些操作,例如

if(ids ==null && ids.length<=0)

       已知ids为空了,但是还调用ids.length属性,应该将&&修改为||

处理方式:这种情况很多时候都是出现在上面的示例代码中,请检查&&||         的使用;

Method invokesinefficient Number constructor; use static valueOf instead

描述:调用Number对象(Long,Integer, Float)低效的构造方法,使用静态的     valueOf方法;

处理方式:在将一个String对象转化为对应的Number对象的时候,通常会使       newLong(stringObj);实际上使用Long.valueOf(stringObj)会更好;

Null pointerdereference

描述:对已知为null的对象进行一些操作,例如

if(ids ==null && ids.length<=0)

       已知ids为空了,但是还调用ids.length属性,应该将&&修改为||

处理方式:这种情况很多时候都是出现在上面的示例代码中,请检查&&||         的使用;和Load of knownnull value相伴出现,处理方式一样;

Equals method shouldnot assume anything about the type of its argument

描述:Equals方法不应该对类型作任何假设;

处理方式:通常在调用Class.isInstance去判断对象的相等性的时候会出现;

Field isn't final butshould be

描述:某些字段应该是final的,但是不是;

处理方式:public static String LOCAL_CACHE_PROPERTY_NAME= "cache.clustering.local.class"; 通常会出现在静态常量的定义中;

Write to static fieldfrom instance method

描述:在实例方法中修改静态属性;

处理方式:避免在实例方法中对静态变量做修改;

Unused field

描述:未被用到的字段;

处理方式:去掉如果确实没有用到;

Nullcheck of valuepreviously dereferenced

描述:先前已经进行过空值检查了;

处理方式:在这里不需要进行空置检查;

Method uses the samecode for two branches

描述:if else 两个分支执行同样的代码;

处理方式:检查代码是否正确,如果是正确的,就不需要if else了;

Method might ignoreexception

描述:方法可能忽略异常

处理方式:对异常的处理作出检查,这样的情况通常出现在如下代码:

              Try{ }catch(Exception r){ }

 

posted @ 2016-07-12 21:06  江晓曼博客园  阅读(371)  评论(0编辑  收藏  举报