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){ }