天天看點

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:

描述: