記錄安全掃描後進行的程式碼重構各類問題以及處理辦法
專案因為是政府的專案,需要對程式碼進行安全掃描,花了點時間對程式碼進行重構,所以對問題做下記錄,大家有更好的解決辦法歡迎指出,會隨時進行補充問題
1、Either log or rethrow this exception.(日誌或重新丟擲此異常。)
處理方式:在catch中加上列印日誌
logger.error("新增的說明資訊 ",e);
2、Remove this useless assignment to local variable "XXX".(刪除這個無用的賦值到區域性變數“XXX”)
處理方式:將這兩段程式碼合併為一列 List<String> timelist = getTimeList();
3、This block of commented-out lines of code should be removed.(刪除這段註釋掉的程式碼塊)
處理方式:直接將註釋的程式碼刪除
4、Define a constant instead of duplicating this literal "repeatData" 3 times.(定義一個常量,而不是重複這個“repeatData”3次。)
例子:在一個類裡面多次使用了一樣的字串文字
處理方式:定義類常量或者列舉類或者介面常量類,用常量來代替重複的文字
5、duplicated blocks of code must be removed.(必須刪除重複的程式碼塊。)
這類問題在程式碼重構是碰到最多的
處理方式:抽取重複的程式碼塊作為一個共用的方法或者抽取工具類方法
6、Refactor this code to not nest more than 3 if/for/while/switch/try statements.(重構此程式碼以不巢狀超過3 if/for/while/switch/try語句。)
這也是最常見的問題 巢狀if for過多
解決辦法:1抽取方法,
2.使用設計模式
3. 採用衛語句
7.Refactor this method to reduce its Cognitive Complexity from 48 to the 15 allowed.(重構這種方法,將其認知複雜性從48降低到15。)
表示一個方法行數很多比較複雜,同樣的解決辦法就是抽取方法,講一個方法拆分幾個方法
8.Method has 9 parameters, which is greater than 7 authorized.(方法有9個引數,大於7個授權引數。)
一個方法引數過多,解決辦法封裝成物件或者map
9、Replace the synchronized class "StringBuffer" by an unsynchronized one such as "StringBuilder".(將同步類“StringBuffer”替換為非同步類,例如“StringBuilder”。)
其實如果用StringBuffer時 jdk也會進行鎖消除的
10、Refactor this method to throw at most one checked exception instead of: java.lang.NoSuchMethodException, java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException(重構此方法以丟擲最多一個檢查異常)
解決辦法:自定義執行時異常,或者丟擲更大的異常
11、NullPointerException might be thrown as 'session' is nullable here(可能會丟擲NullPointerException,因為“session”在這裡是可空的)
處理方式:加一個非空判斷
12、Close this "InputStreamReader".(關閉這個“InputStreamReader”。)
輸入輸出流在finally中進行關閉
13、Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.(新增一個巢狀註釋,解釋為什麼這個方法是空的,丟擲UnsupportedOperationException,或者完成這個實現。)
處理方式:因為不需要實現這個方法所以直接添加註釋解釋一下
14、Make "modelparam" transient or serializable.
頂層介面物件或者抽象類的引用是沒有實現序列化介面的,所以實體實現了系列化的時候,這些頂層介面的引用編譯時無法確定型別
解決方法:
- 使用實現了序列化介面的子類
- 使用transient關鍵字表示不序列化該欄位
15、Reduce the number of conditional operators (7) used in the expression (maximum allowed 3).
一個if的條件表示式過多問題
解決辦法提取表示式成為一個方法
變更前:
變更後: