天天看点

FindBugs Warnings 警告类型文档FindBugs Warnings 警告类型文档

一、 

type : ei_expose_rep

category:malicious_code(恶意程序代码)

描述:may exposeinternal representation by returning  getter方法返回引用类型

eclipse自动生成的引用类型(object、数组、date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现,解决方法很多,只要返回的或赋值的对象不是原引用对象即可。

例如:

以date类型为例:

private java.util.datefirstdate;

publicvoidsetfirstdate(java.util.datevalue) {

       this.firstdate =value;

    }

    public java.util.date getfirstdate(){

       returnthis.firstdate;

改为:

public string getfirstdate() {

       returnfirstdate;

    publicvoidsetfirstdate(stringfirstdate)

{

       this.firstdate =firstdate;

二、 

type : ei_expose_rep2

描述:may expose internal representation by storing an externallymutable object into  setter方法返回引用类型

    public java.util.dategetfirstdate() {

    publicvoid setfirstdate(stringfirstdate)

三、 

type : wmi_wrong_map_iterator

category:performance(性能)

描述:使用keyset迭代器无效,请使用entryset迭代器代替

解释:很多人都这样遍历map,没错,但是效率很低,先一个一个的把key遍历,然后在根据key去查找value,这不是多此一举么,为什么不遍历entry(桶)然后直接从entry得到value呢?它们的执行效率大概为1.5:1(有人实际测试过)。

我们看看hashmap.get方法的源代码:

publicv get(object

key) {

    if (key==null)

        returngetfornullkey();

    inthash=hash(key.hashcode());

    for (entry<k,v>

e =table[indexfor(hash,table.length)];e

!=null;e =

e.next) {

        object

k;

        if (e.hash ==hash&&

((k =e.key) ==

key ||

key.equals(k)))

            returne.value;

    returnnull;

}

从这里可以看出查找value的原理,先计算出hashcode,然后散列表里取出entry,不管是计算hashcode,还是执行循环for以及执行equals方法,都是cpu密集运算,非常耗费cpu资源,如果对一个比较大的map进行遍历,会出现cpu迅速飚高的现象,直接影响机器的响应速度,在并发的情况下,简直就是一场灾难。

四、 

type : se_bad_field_store

category:bad_practice

描述:不可序列化的值存储在一个可序列化类的实例字段中

五、 

type : sbsc_use_stringbuffer_concatenation

描述:方法在一个循环中使用“+”运算符拼接字符串

解释:每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低。

六、

type : rv_return_value_ignored_bad_practice 

描述:方法忽略异常的返回值

解释:

关于一个方法逻辑执行是否成功,有两种方式:

一种是抛出异常,一种是提供boolean类型的返回值。举一个例子,用户登录,某些人将login方法的返回值定义为int,然后枚举出各个值的含义,比如0代表成功,1代表用户名不存在等等;而有些人,把这些枚举值看成是use case中的异常流,将它们定义为异常对象,遇到“异常”情况直接抛出异常从而实现分支的流程。第一种方式是典型的c语言面向过程风格,

第二种方式,带有强烈的面向对象味道,特别是java提供了checked exception,貌似偏离主题了。

java中很多方法的执行成功依赖于异常的分支实现,但也有提供返回值的实现,比如这里的file.delete方法,上面的写法忽略了返回值(如果调用某个方法却不使用其返回值要特别注意),删除一个文件很可能不成功,但是从代码里并没有看到这一层面的意思。

解决方法:

文件删除不成功该怎么办?现在能处理就处理,现在不能处理就把父类的方法也改成有返回值的,然后向上传递,这跟处理异常的道理是一样的,当然,你也可以把它封装成一个异常对象。

七、 

type : obl_unsatisfied_obligation_exception_edge

category:experimental

描述:在处理异常时,方法可能未能成功清理流或资源

八、 

type : np_null_on_some_path_exception

category:correctness

描述:方法中的异常路径上的可能的空指针解引用

九、 

type : np_load_of_known_null_value

category:style

描述:加载已知为空的值

十、 

type : nm_method_naming_convention

描述:方法名应当以小写字母开头

十一、       

type : nm_class_naming_convention 

描述:类名应当以大写字母开头

十二、       

type : eq_doesnt_override_equals 

描述:类没有覆盖父类中的equals方法

十三、       

type : eq_compareto_use_object_equals 

描述:类定义了compareto(...)方法,使用了object.equals()方法

没有使用instanceof判断就直接转型,有抛出classcastexception异常的可能。

这个bug主题是,遵守约定(x.compareto(y)==0) == (x.equals(y)),强烈建议,但不严格要求。

在return 0的时候,调用equals方法返回true,因为在priorityqueue.remove方法中,1.5使用的是compareto方法,而1.6使用的是equals方法,保证环境升级的时候,受影响最小。

         在return 0的时候,调用equals方法返回true

十四、       

type : dmi_using_removeall_to_clear_collection 

描述:不要使用removeall方法清空一个集合

十五、       

type : dm_number_ctor 

描述:方法调用无效的number构造器,请使用valueof静态方法代替

十六、       

type : dm_nextint_via_nextdouble

描述:为了生成一个随机整数,调用random对象的nextint方法,而不是nextdouble方法

十七、       

type : dm_boxed_primitive_for_parsing 

描述:使用封装/反封装来解析一个基本类型

例如1:

renturnrecord.setparts(integer.valueof(parts[i]));

处理:

renturnrecord.setparts(integer.valueof(parts[i]).intvalue());

十八、     

type : dls_dead_local_store

描述:死存储局部向量

十九、     

type : bx_unboxing_immediately_reboxed  

描述:反封装已经封装的值,然后又立即重新封装

二十、     

type : uuf_unused_field

描述:未使用字段

解释:这个警告应该影响不大吧!

type :

category:

描述: