我使用Sonar工具來分析現有應用程序中的編碼標準,其中我遇到了Sonar規則:「關閉資源」,其中連接的對象conn是罪魁禍首。通過finally塊中的方法關閉連接其他類中的對象
正如我們所知,我們應該使用conn.close();
關閉Connection對象,但在應用程序中釋放連接的方法已被調用。
下面是一段代碼,其中Connection對象通過finally塊中的名爲releaseConnection()
的方法關閉。
finally {
try {
OtherClass.releaseConnection(conn); // Line: 50 Here is the call to close the conn
}
catch (SomeException se) {
LOGGER.error(" Exception while releaseConnection in add() method : ",se);
}
}
關閉方法:
public static void releaseConnection(Connection conn) throws DBException {
if (conn!=null) {
try {
if (!conn.isReadOnly()){
conn.commit();
}
} catch (SQLException e) {
LOGGER.error("Error while commiting the connection. " + e);
rollback(conn);
throw new SomeException(e,SOMETHING);
} finally {
try {conn.close();} catch (SQLException se){
LOGGER.error("releaseConnection() Error " + se);
}
}
}
}
這是我所關注的名單:
由於這個現有的實現是在做正確的事情(糾正我,如果我錯了)是它根據聲納的建議確實需要更改代碼。
如果真的需要關注Sonar的建議,最好的方法是什麼。
UPDATE:
我怎麼能忽略/旁路一定的代碼或規則,在我上面的代碼適用。 可以說我想忽略Line:50,我該怎麼做?
我不想惹上面的代碼,但我真的想忽略這一點,使我的問題更少。提前致謝。
感謝您的回覆!那麼是否有任何方法可以忽略這個特定的代碼,或者我可以強制sonar去finally塊中調用的方法{releaseConnection()}。這是Sonar的一個意外和令人不安的限制。 @ben – MonsterJava
在這種情況下,沒有簡單的解決方法,您應該將問題標記爲誤報。至於行爲,仿真執行流程對於異常來說是一個非常複雜的問題,我們每天都在努力改進我們的引擎。 – benzonico
感謝@ben的快速回復。你能幫我選擇「你應該把問題標記爲誤報」,你的意思是聲納提供這種類型的任何選項嗎? – MonsterJava