1. 程式人生 > >findbug的錯誤型別及修改建議

findbug的錯誤型別及修改建議

分配了findbug修正的任務,以下是自己findbug中錯誤型別的整理。

ME_ENUM_FIELD_SETTER
將方法改成private或者是移除

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;
}
}

STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE
DateFormats 是非執行緒安全的, 其實要避免這個問題方法很簡單,不使用SimpleDateFormat,或者不使用成員變數/靜態成員變數的SimpleDateFormat物件即可。
參考:

http://rainbow702.iteye.com/blog/1155362

NM_METHOD_NAMING_CONVENTION
方法應該是動詞,與第一個字母小寫混合的情況下,與每個單詞的首字母大寫的內部。
方法名不以小寫字母開始

方法應該是動詞,與第一個字母小寫字母大小寫混合,與內部每個詞的第一個字母大寫。

引數名大小寫注意

RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
關於一個方法邏輯執行是否成功,有兩種方式,一種是丟擲異常,一種是提供boolean型別的返回值。舉一個例子,使用者登入,某些人將login方法的返回值定義為int,然後枚舉出各個值的含義,比如0代表成功,1代表使用者名稱不存在等等;而有些人,把這些列舉值看成是use case中的異常流,將它們定義為異常物件,遇到“異常”情況直接丟擲異常從而實現分支的流程。第一種方式是典型的C語言面向過程風格,第二種方式,帶有強烈的面向物件味道,特別是java提供了checked Exception,貌似偏離主題了。
java中很多方法的執行成功依賴於異常的分支實現,但也有提供返回值的實現,比如這裡的File.delete方法,上面的寫法忽略了返回值(如果呼叫某個方法卻不使用其返回值要特別注意),刪除一個檔案很可能不成功,但是從程式碼裡並沒有看到這一層面的意思。
解決方法:
檔案刪除不成功該怎麼辦?現在能處理就處理,現在不能處理就把父類的方法也改成有返回值的,然後向上傳遞,這跟處理異常的道理是一樣的,當然,你也可以把它封裝成一個異常物件。

OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE
方法可能因為checked exception導致清理流或資源失敗
參考:http://just4java.iteye.com/blog/2160704

1. 
  • public static void closeResources (Connection con, PreparedStatement ps,ResultSet rs){
  • try {
  • if (rs != null) {
  • rs.close();
  • }
  • } catch (SQLException e) {
  • LOG.error(“釋放ResultSet出錯”, e);
  • } finally {
  • try {
  • if (ps != null){
  • ps.close();
  • }
  • } catch (SQLException e) {
  • LOG.error(“釋放PreparedStatement出錯”, e);
  • } finally {
  • if (con != null) {
  • try {
  • con.close();
  • } catch (SQLException e) {
  • LOG.error(“釋放Connection出錯”, e);
  • }
  • }
  • }
    }
  • }

DM_STRING_VOID_CTOR
使用沒有引數的構造方法去建立新的String物件是浪費記憶體空間的,因為這樣建立會和空字串“”混淆。Java中保證完成相同的構造方法會產生描繪相同的String物件。所以你只要使用空字串來建立就可以了。

DM_STRING_CTOR
使用java.lang.String(String)建構函式會浪費記憶體因為這種構造方式和String作為引數在功能上容易混亂。只是使用String直接作為引數的形式

DM_BOXED_PRIMITIVE_FOR_PARSING
使用parseInt更有效率一點。
valueOf().intValue():轉換過程是
parseInt:

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();
}else{
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;
}
}

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;

DLS_DEAD_LOCAL_STORE

public static void main(String args[]) throws Exception{
Object str = new Object() ;  //報錯處
str = new Object() ;
System.out.println(str);
}
Object str = new Object();是無用的程式碼,因為在下面有一句str= new Object();,很多語言編譯器它都會做優化,比如:去除一些無用的程式碼以提高效率。JAVA編譯器也會做一些優化,但是,Java編譯器對上面這段程式碼卻沒有做優化(你可以DComplie確認一下),編譯後的.class檔案還是new了兩次,具體什麼原因導致它不去做這個優化我還不能確定,我覺得難做這種優化不是藉口,起碼不應該是Sun的藉口。
修改這段程式碼方法很簡單,隨便去掉一行new Object();就可以了。

SBSC_USE_STRINGBUFFER_CONCATENATION

方法在迴圈中使用+進行字串拼接
For example:
// This is bad

String s =”“;

for (int i = 0; i< field.length; ++i) {

s = s +field[i];

}
// This is better

StringBuffer buf= new StringBuffer();

for (int i = 0; i< field.length; ++i) {

buf.append(field[i]);

}

String s = buf.toString();

NP_NULL_ON_SOME_PATH_EXCEPTION
可能存在為空的情況,必須進行處理,而不是產生null指標

public void test(){
//
ResultSet rs = cmd.executeQuery();
if (rs != null && rs.next()) {
goodsId = rs.getInt(“goods_id”);
}
rs.close();  //rs可能為null
//
}
可以用try…catch…finally…處理可能出現的異常,也可以在rs.close之前,先判斷rs是否為null

ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL
integral的值轉換為double後使用了Math.ceil方法

注意前後int 和double的轉換

DM_DEFAULT_ENCODING
編碼格式問題,沒有設定預設編碼格式,這可能導致在不同平臺上出現編碼不一致的問題

RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE
對非空的不斷重複檢查

NP_ALWAYS_NULL

IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN
將忽略此引數的初始值和引數是覆蓋。這通常表明一種錯誤的觀念就是,寫入引數將被返回給呼叫者。

UC_USELESS_OBJECT
報錯,無用的物件。檢查物件是否有使用

REC_CATCH_EXCEPTION

RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE
一個多餘的空判斷
檢查一個值是否為空,但這個值不能是零,因為以前的引用時,如果是空一個空指標異常發生在前面的廢棄。從本質上講,這段程式碼和前面的廢棄不同意這個值是否允許空值。檢查是多餘的或以前的廢棄是錯誤的。

RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT

SA_LOCAL_SELF_ASSIGNMENT
public void fun(){
int x =3;
x = x;
}

SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH

MS_CANNOT_BE_FINAL
增加final

UWF_UNWRITTEN_FIELD
欄位永遠沒被複制,值一直為空

DMI_HARDCODED_ABSOLUTE_FILENAME
包含一個硬編碼的絕對路徑

NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
方法的返回值沒有進行是否為空的檢查就重新賦值,這樣可能會出現空指標異常。

BC_VACUOUS_INSTANCEOF
在instanceof判斷中,除非為空,否則永遠是true,如果是為了判斷空,用更好的方法判斷。使用instanceof判斷會使得程式不利於別人理解。

DC_DOUBLECHECK
多執行緒錯誤 - 可能對屬性進行了雙重檢測

IS2_INCONSISTENT_SYNC

RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE

NP_NULL_ON_SOME_PATH
可能存在為空的引用,應考慮其解決

相關推薦

findbug錯誤型別修改建議

分配了findbug修正的任務,以下是自己findbug中錯誤型別的整理。 ME_ENUM_FIELD_SETTER 將方法改成private或者是移除 ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD 描述:Write

PHP錯誤型別遮蔽方法

程式只要在執行,就免不了會出現錯誤,錯誤很常見,比如Error,Notice,Warning等等 1. 注意(Notices) 這些都是比較小而且不嚴重的錯誤,比如去訪問一個未被定義的變數。通常,這類的錯誤是不提示給使用者的,但有時這些錯誤會影響到執行的結果。2. 警告

Access中欄位型別修改欄位型別的SQL語句

Access中的資料型別 Access中有10中資料型別:文字、備註、數值、日期/時間、貨幣、自動編號、是/否、OLE物件、超級連結、查詢嚮導。 1、文字(Text(n)):這種型別允許最大255個字元或數字,Access預設的大小是50個字元,而且系統只儲存輸入到欄位中的字元,而不儲存文字欄位中未用位置

findBug 錯誤修改指南

var 查找 rip 內部類 sid 並且 代碼 force sim 1. EC_UNRELATED_TYPESBug: Call to equals() comparing different types Pattern id: EC_UNRELATED_TYPES,

流程圖設計的常見錯誤糾正建議

流程圖設計 流程圖 設計 錯誤 糾正 我目前正在企業做咨詢,不同的企業人員在首次設計流程圖時所犯錯誤基本相同,或者說常見錯誤一樣。因此,我想列舉一下企業員工設計流程圖的常見錯誤,只要大家把錯誤改正了,就能設計出美觀實用的流程圖來。我發現的流程圖設計常見錯誤如下:●張冠李戴,結構流程與活動流

findBug 錯誤修改指南(轉載)

FindBugs錯誤修改指南  1. EC_UNRELATED_TYPES Bug: Call to equals() comparing different types Pattern id: EC_UNRELATED_TYPES, type: EC, cat

DB2中遇到的錯誤修改方法

錯誤1com.ibm.db2.jcc.b.nm: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.SOFT_VERSION, DRIVER=3.50.152原因是:表SOFT_VERSION不是直接

開發中遇到的各種坑爹錯誤修改

一、eclipse android開發配置 (1)、sdk更新失敗               出錯問題: 下載並解壓sdk之後,點選sdk manager.exe 下載更新,出現網址找不到的問題。               出錯原因:資源下載網站被遮蔽了,電腦不解析為i

修改圖片的MIME型別使其名稱排序的指令碼

correctMIMEType模組: import os,sys,shelve,time def correctMIMEType(): moduleFileName='correctMIMEType.py' fileTypeFile='fileType' mime

Python物件模型錯誤型別

BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- Buff

linux文件權限查看修改-chmod ------入門的一些常識

子目錄 以及 利用 動作 兩個 oot 屬性 詳細 chown 查看Linux文件的權限:ls -l 文件名稱查看linux文件夾的權限:ls -ld 文件夾名稱(所在目錄)修改文件及文件夾權限:sudo chmod -(代表類型)×××(所有者)×××(組用戶)×××(其

Linux命令 查看修改文件屬性

若是 有用 -s 工作組 文件類型 大牛 tro 命令執行 建立 chmod [功能說明] 改變文件的訪問權限 #Linux中訪問權限分為:文件屬主(文件的創建者)文件組屬主(創建者所處的組)和其他(其他用戶) [語法格式] Chmod[參數]mode[文件名或目錄名]

網絡連接返回getsockopt: connection refused錯誤原因 listen

pan span ets lis strong soc 服務端 服務 con 客戶端訪問的ip寫錯或者服務端的listen ip寫錯 listen(":8080") == listen("0.0.0.0:8080”) 可以用127.0.0.1:8080訪問,也可以用網卡i

Linux UTC,CST時間修改時間

tag system 使用 本地 -s linux操作系統 一段時間 操作系統 選項 1。安裝linux的時候在設置時間的時候有一個選項: system clock uses UTC,那麽這個UTC是什麽意思呢?世界協調時間(Universal Time Coordinat

PHP Apache shutdown unexpectedly啟動錯誤解釋解決的方法

csdn ext block div lin p s 配置 ras host 在學PHP的時候,偶然發現XAMPP窗體Apache的啟動出現錯誤,出現下面的錯誤提示: 9:52:41 [Apache] Attempting to start Apache app..

Adaboost 算法的原理與推導——轉載修改完善

否則 3.5 十大算法 實例 訓練集 又是 根據 -o out 《Adaboost算法的原理與推導》一文為他人所寫,原文鏈接: http://blog.csdn.net/v_july_v/article/details/40718799 另外此文大部分是摘錄李航的《統計學筆

Java I/O 操作優化建議

java.net 底層 str 面向對象 div 選擇 static 右移 linux Java I/OI/O。即 Input/Output(輸入/輸出) 的簡稱。就 I/O 而言。概念上有 5 種模型:blocking I/O,nonblocking I/O。I/O

Linux下查看文件編碼修改編碼

tar enca strong lin help 添加 解決 讀取 列表 查看文件編碼在Linux中查看文件編碼可以通過以下幾種方式:1.在Vim中可以直接查看文件編碼:set fileencoding即可顯示文件編碼格式。如果你只是想查看其它編碼格式的文件或者想解決用Vi

linux環境下關於顯示日期修改密碼的小練習

一只小菜鳥的成長1.顯示1984-11-18是1984年的第幾天 2.顯示當前的日期 ##上面是兩種不同的表現形式## 3.在超級用戶下修改student用戶的密碼,並且student用戶在第一次登錄後強制修改密碼 ## passwd -e ## 強制修改密碼##註意:當使用root用戶修改其他用戶密

linux裏網卡配置文件修改主機名

linux裏網卡配置文件及修改主機名1.2網卡配置文件DEVICE 網卡名稱(第一塊eth0,第二塊eth1.....以此類推)HWADDR 網卡MAC的地址UUID 唯一標識,磁盤標識-------blkid(查看)ONBOOT 重啟網卡或服務器之後控制網卡是不是自啟BOOTPROTO 網卡啟動