FindBugs常見錯誤描述和解決方法

(一)[DLS_DEAD_LOCAL_STORE]
描述: Dead store to 未使用的局部變量
解決方法:局部變量定義後未使用;實例化對象後又從新對該對象賦值


(二) [ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD] 
描述:Write to static field 經過實例方法更新靜態屬性
常見於常量類,直接經過類名.常量名獲取的方式違背了封裝的原則,findbugs不提倡使用,而若是將常量改爲靜態成員變量,又由於spring不支持靜態注入致使不能實現,解決方法是非靜態的setter調用靜態的setter方法給靜態成員變量賦值。
解決方法:
常量類F:
class F{
public static String a = 「123」;
}
常量a改成靜態成員變量,經過F.getA()獲取,且因爲spring不支持靜態注入,改成:
class F{
  private static String a;
  public static Integer getA() {
return a;
}
public void setA(String a) {
setAValue(a);
}
public static void setAValue(String a) {
F.a = a;
}
}


(三) [BX_UNBOXING_IMMEDIATELY_REBOXED]
描述: Boxed value is unboxed and then immediately reboxed  裝箱的值被拆箱,而後馬上從新裝箱了
常見的是三目運算時,同時存在基本類型和包裝類型。
解決方法:
Integer a = null;
//...
a = (a == null)?0:a;
此問題在於a不爲null時,會被拆箱,賦值時再裝箱。這是自動裝箱拆箱的特性,只要運算中有不一樣類型,當涉及到類型轉換時,編譯器就會向下轉型,再進行運算。修改方法,統一類型:
Integer a = null;
//...
a = (a == null)?Integer.valueOf(0):a;


(四) [SE_BAD_FIELD] 
描述: Non-transient non-serializable instance field in serializable class在可序列化的類中存在不能序列化或者不能暫存的數據
解決方法:
方法1:序列化該對象
方法2:當採用struts2框架開發,不可避免的此問題會大量出現,由於ActionSupport實現了序列化接口,action繼承了此類,而 service沒序列化,因此在action中引用service對象時提示此錯誤,最簡單的解決方法是將service對象聲明成transient, 即service不須要序列化
方法3(未驗證):To avoid java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableExceptionfrom those method.(action中實現這兩個方法?)
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
  throw new java.io.NotSerializableException( getClass().getName() );
}
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
  throw new java.io.NotSerializableException( getClass().getName() );
}


(五) [NP_LOAD_OF_KNOWN_NULL_VALUE] 
描述: Load of known null value加載已知是null的值
解決方法:已知方法參數爲null是,直接傳遞null而不是參數名


(六) [REC_CATCH_EXCEPTION]
描述: Exception is caught when Exception is not thrown 過泛地捕獲異常或捕獲異常後未作任何處理
解決方法:異常分類捕獲(至少要打印出此異常對象)


(七) [NP_NULL_PARAM_DEREF]
描述: Null passed for nonnull parameter  把空值傳給了非空的參數
解決方法:增長非空判斷


(八) [NP_IMMEDIATE_DEREFERENCE_OF_READLINE]
描述: Immediate dereference of the result of readLine() 當即引用了readLine()的結果
解決方法:判斷readLine的結果是否爲空


(九) [EI_EXPOSE_REP] 惡意代碼漏洞
描述:may expose internal representation by returning  getter方法返回引用類型
eclipse自動生成的引用類型(Object、數組、Date等)的getter、setter方法會獲得或經過對可變對象的引用操做而暴露代碼內部實現,解決方法不少,只要返回的或賦值的對象不是原引用對象便可。
解決方法:
以Date類型爲例:
public Date getHappenTime() {
if(happenTime != null){
return (Date) happenTime.clone();
}
  return null;
}


(十) [ EI_EXPOSE_REP2] 惡意代碼漏洞
描述:may expose internal representation by storing an externally mutable object into  setter方法返回引用類型
eclipse自動生成的引用類型(Object、數組、Date等)的getter、setter方法會獲得或經過對可變對象的引用操做而暴露代碼內部實現,解決方法不少,只要返回的或賦值的對象不是原引用對象便可。
解決方法:
以Date類型爲例:
public void setHappenTime(Date happenTime) {
if(happenTime != null){
this.happenTime = (Date) happenTime.clone();
}else{
this.happenTime = null;
}
}
java

相關文章
相關標籤/搜索