2016-03-22 39 views
2

我使用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); 
      } 
     } 
    } 
} 

這是我所關注的名單:

  1. 由於這個現有的實現是在做正確的事情(糾正我,如果我錯了)是它根據聲納的建議確實需要更改代碼。

  2. 如果真的需要關注Sonar的建議,最好的方法是什麼。

UPDATE:

我怎麼能忽略/旁路一定的代碼或規則,在我上面的代碼適用。 可以說我想忽略Line:50,我該怎麼做?

我不想惹上面的代碼,但我真的想忽略這一點,使我的問題更少。提前致謝。

回答

2

你實際上是遇到了象徵性的執行引擎的限制(這是引擎蓋下使用此規則):https://jira.sonarsource.com/browse/SONARJAVA-1591

這裏發生的事情是,我們大致執行中的try/catch /終於流通過使跳過整個try塊的執行路徑(以簡化流的處理)並導致您提到的誤報,因爲我們沒有看到對您的方法的調用,從而避免了引發問題。

+0

感謝您的回覆!那麼是否有任何方法可以忽略這個特定的代碼,或者我可以強制sonar去finally塊中調用的方法{releaseConnection()}。這是Sonar的一個意外和令人不安的限制。 @ben – MonsterJava

+1

在這種情況下,沒有簡單的解決方法,您應該將問題標記爲誤報。至於行爲,仿真執行流程對於異常來說是一個非常複雜的問題,我們每天都在努力改進我們的引擎。 – benzonico

+0

感謝@ben的快速回復。你能幫我選擇「你應該把問題標記爲誤報」,你的意思是聲納提供這種類型的任何選項嗎? – MonsterJava

2

沒錯!聲納不檢查是否有任何方法從finally塊被調用來關閉資源。它只是檢查資源的關閉。

相關問題