sonarQube常見問題及分析


阻斷
1、Close this"FileInputStream" in a "finally" clause.
在finally中關閉FileInputStream,這個最為常見,主要是關閉方式不對,finally代碼塊中,應該要對每個stream進行單獨關閉,而不能統一寫在一個try-catch代碼中,jdk 7 可以考慮try-resources方式關閉,代碼相對優雅。

另外數據庫操作的statement和resultRs沒有關閉的情況也非常多。這個也是要重點留意的地方。

2、A"NullPointerException" could be thrown; "tom" is nullablehere
空指針,極為討厭的問題,主要是編碼經驗缺少的體現。一般的高手在編碼過程中,就會第一時間考慮到這類情況,並做相應的處理。解決方式無它,先判斷或者先實例化,再訪問里面的屬性或者成員。


嚴重
1、Define and throw a dedicated exception instead of using a generic one
定義並拋出一個專用的異常來代替一個通用的異常。

2、Removethis hard-coded password
移除代碼里硬編碼的密碼信息。會有少許的誤判的情況,一般是變量包含:PWD或者password,所以如果真的不是硬編碼,可以考慮更換變量名稱,比如PWD改PW等等。

3、Eitherlog or rethrow this exception
catch異常之后,使用log方式或者throw異常的方式解決。如果業務上真的沒有throw或者記錄日志的話,可以使用log.debug的方式填充來解決問題。

4、Makethis IP "127.0.0.1" address configurable
將IP弄到配置文件中,不要硬編碼到代碼里。個人覺得改動稍大!

5、Make this"public static JSAPI" field final
如果你將這個變量設置為public訪問方式,同時又是靜態Static方式,就要考慮將它設置為final了,因為這個是共享變量,其它類可以隨時隨地將它設置為別的值。所以如果是只是當前類使用,可以考慮將公開訪問方式改為私有。

6、Makethe enclosing method "static" or remove this set
見代碼:
public class MyClass {
private static int count = 0;
public void doSomething() {
//...
count++; // Noncompliant
}
}
不要使用非靜態方法去更新靜態字段,這樣很難獲得正確的結果,如果有多個類實例和/或多個線程,則很容易導致錯誤。理想情況下,靜態字段僅從同步靜態方法中更新。

7、Override"equals(Object obj)" to comply with the contract of the"compareTo(T o)" method
如果重寫了compareTo方法,同時也應重寫equals方法。

8、Make"body" transient or serializable.
public class Address {
//...
}

public class Person implements Serializable {
private static final long serialVersionUID = 1905122041950251207L;

private String name;
private Address address; // Noncompliant; Address isn't serializable
}


如果person已經序列化,其成員變量Address也進行序列化。不然轉化時會有問題。

9 Floating point numbers should not be tested for equality
浮點類型的數字,不要通過==或者!=方式其它類型比較,因為浮點是不精確的,所以在比較時,會進行類型升級升級原則如下:
· 如果運算符任意一方的類型為double,則另一方會轉換為double
· 否則,如果運算符任意一方的類型為float,則另一方會轉換為float
· 否則,如果運算符任意一方的類型為long,則另一方會轉換為long
· 否則,兩邊都會轉換為int

以下的方式得到的結果都是false。
float myNumber = 3.146;
if ( myNumber == 3.146f ) { //Noncompliant. Because of floating point imprecision, this will be false

if ( myNumber != 3.146f ) { //Noncompliant. Because of floating point imprecision, this will be true


if (myNumber < 4 || myNumber > 4) { // Noncompliant; indirect

float zeroFloat = 0.0f;
if (zeroFloat == 0) { // Noncompliant. Computations may end up with a value close but not equal to zero.
}

所以,要比較浮點數是否相等,需要做的事情是:

排除NaN和無窮
在精度范圍內進行比較
正確的例子:
public boolean isEqual(double a, double b) {
if (Double.isNaN(a) || Double.isNaN(b) || Double.isInfinite(a) || Double.isInfinite(b)) {
return false;
}
return (a - b) < 0.001d;
}

10、Thiscall to "contains()" may be a performance hot spot if the collectionis large.
如果collection的記錄數非常大的話,它的contains方法的時間復雜度是很高的。所以開發過程中要注意這一點。下面的是列表:
· ArrayList
contains
remove
· LinkedList
get
contains
· ConcurrentLinkedQueue
size
contains
· ConcurrentLinkedDeque
size
contains
· CopyOnWriteArrayList
add
contains
remove
· CopyOnWriteArraySet
add
contains
remove


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM