一、
Type : EI_EXPOSE_REP
Category:MALICIOUS_CODE(惡意程序代碼)
描述:may exposeinternal rePResentation by returning getter方法返回引用類型eclipse自動生成的引用類型(Object、數(shù)組、Date等)的getter、setter方法會得到或通過對可變對象的引用操作而暴露代碼內部實現(xiàn),解決方法很多,只要返回的或賦值的對象不是原引用對象即可。
例如:
以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
Category:MALICIOUS_CODE(惡意程序代碼)
描述:may expose internal representation by storing an externallymutable object into setter方法返回引用類型eclipse自動生成的引用類型(Object、數(shù)組、Date等)的getter、setter方法會得到或通過對可變對象的引用操作而暴露代碼內部實現(xiàn),解決方法很多,只要返回的或賦值的對象不是原引用對象即可。
例如:
以Date類型為例:
private java.util.Datefirstdate;
publicvoidsetFirstdate(java.util.Datevalue) {
this.firstdate =value;
}
public java.util.DategetFirstdate() {
returnthis.firstdate;
}
改為:
public String getFirstdate() {
returnfirstdate;
}
publicvoid setFirstdate(Stringfirstdate) {
this.firstdate =firstdate;
}
三、
Type : WMI_WRONG_MAP_ITERATOR
Category:PERFORMANCE(性能)
描述:使用keySet迭代器無效,請使用entrySet迭代器代替
解釋:很多人都這樣遍歷Map,沒錯,但是效率很低,先一個一個的把key遍歷,然后在根據(jù)key去查找value,這不是多此一舉么,為什么不遍歷entry(桶)然后直接從entry得到value呢?它們的執(zhí)行效率大概為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,還是執(zhí)行循環(huán)for以及執(zhí)行equals方法,都是CPU密集運算,非常耗費CPU資源,如果對一個比較大的map進行遍歷,會出現(xiàn)CPU迅速飚高的現(xiàn)象,直接影響機器的響應速度,在并發(fā)的情況下,簡直就是一場災難。
四、
Type : SE_BAD_FIELD_STORE
Category:BAD_PRACTICE
描述:不可序列化的值存儲在一個可序列化類的實例字段中
五、
Type : SBSC_USE_STRINGBUFFER_CONCATENATION
Category:PERFORMANCE(性能)
描述:方法在一個循環(huán)中使用“+”運算符拼接字符串
解釋:每次循環(huán)里的字符串+連接,都會新產(chǎn)生一個string對象,在java中,新建一個對象的代價是很昂貴的,特別是在循環(huán)語句中,效率較低。
例如:
六、
Type : RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
Category:BAD_PRACTICE
描述:方法忽略異常的返回值
解釋:
關于一個方法邏輯執(zhí)行是否成功,有兩種方式:
一種是拋出異常,一種是提供boolean類型的返回值。舉一個例子,用戶登錄,某些人將login方法的返回值定義為int,然后枚舉出各個值的含義,比如0代表成功,1代表用戶名不存在等等;而有些人,把這些枚舉值看成是use case中的異常流,將它們定義為異常對象,遇到“異常”情況直接拋出異常從而實現(xiàn)分支的流程。第一種方式是典型的C語言面向過程風格,
第二種方式,帶有強烈的面向對象味道,特別是java提供了checked Exception,貌似偏離主題了。
java中很多方法的執(zhí)行成功依賴于異常的分支實現(xiàn),但也有提供返回值的實現(xiàn),比如這里的File.delete方法,上面的寫法忽略了返回值(如果調用某個方法卻不使用其返回值要特別注意),刪除一個文件很可能不成功,但是從代碼里并沒有看到這一層面的意思。
解決方法:
文件刪除不成功該怎么辦?現(xiàn)在能處理就處理,現(xiàn)在不能處理就把父類的方法也改成有返回值的,然后向上傳遞,這跟處理異常的道理是一樣的,當然,你也可以把它封裝成一個異常對象。
例如:
七、
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
Category:BAD_PRACTICE
描述:方法名應當以小寫字母開頭
十一、
Type : NM_CLASS_NAMING_CONVENTION
Category:BAD_PRACTICE
描述:類名應當以大寫字母開頭
十二、
Type : EQ_DOESNT_OVERRIDE_EQUALS
Category:STYLE
描述:類沒有覆蓋父類中的equals方法
十三、
Type : EQ_COMPARETO_USE_OBJECT_EQUALS
Category:BAD_PRACTICE
描述:類定義了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方法,保證環(huán)境升級的時候,受影響最小。
解決方法:
在return 0的時候,調用equals方法返回true
例如:
十四、
Type : DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION
Category:BAD_PRACTICE
描述:不要使用removeAll方法清空一個集合
十五、
Type : DM_NUMBER_CTOR
Category:PERFORMANCE(性能)
描述:方法調用無效的Number構造器,請使用valueOf靜態(tài)方法代替
十六、
Type : DM_NEXTINT_VIA_NEXTDOUBLE
Category:PERFORMANCE(性能)
描述:為了生成一個隨機整數(shù),調用Random對象的nextInt方法,而不是nextDouble方法
十七、
Type : DM_BOXED_PRIMITIVE_FOR_PARSING
Category:PERFORMANCE(性能)
描述:使用封裝/反封裝來解析一個基本類型
例如1:
renturnRecord.setParts(Integer.valueOf(parts[i]));
處理:
renturnRecord.setParts(Integer.valueOf(parts[i]).intValue());
十八、
Type : DLS_DEAD_LOCAL_STORE
Category:STYLE
描述:死存儲局部向量
解釋:
對本地變量定義了之后未使用到,編譯器能夠做優(yōu)化處理,也就是在編譯之后的class文件中刪除這些本地變量。方法是在eclipse的Preferences里將以下的鉤去除:解決方法:大膽的去掉或者注釋掉。誤報的案例:是一個局部的變量,不需要定義到外部去,定義在外部,可能會變成一個無效的變量。例如:
十九、
Type : BX_UNBOXING_IMMEDIATELY_REBOXED
Category:PERFORMANCE(性能)
描述:反封裝已經(jīng)封裝的值,然后又立即重新封裝
例如:
二十、
Type : UUF_UNUSED_FIELD
Category:PERFORMANCE(性能)
描述:未使用字段
解釋:這個警告應該影響不大吧!
例如:
Type :
Category:
描述:
例如:
新聞熱點
疑難解答