2017-07-07 30 views
2

這是一個問題,而不是問題。規則「資源應該關閉」如何檢查連接已關閉?

我有一個名爲DSConnectionUtilExternal的類,它有一個方法來檢索數據庫連接和一個方法來關閉它。這個類是在一個jar文件中。

另一方面,我有一個項目,包括jar文件作爲依賴項。 在這個proyect我有這樣的代碼

Connection con = null; 
ResultSet rsGet = null; 
PreparedStatement psGet = null; 
try { 
    con = DSConnectionUtilExternal.openConnection(); 

    psGet = con.prepareStatement("SELECT * FROM TEST"); 
    rsGet = psGet.executeQuery(); 
    int counter = 0; 
    while (rsGet.next()) { 
     counter++; 
     System.err.println(counter); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (rsGet != null) { 
      rsGet.close(); 
     } 
    } catch (Exception e2) { 
     e2.printStackTrace(); 
    } 
    rsGet = null; 
    try { 
     if (psGet != null) { 
      psGet.close(); 
     } 
    } catch (Exception e2) { 
     e2.printStackTrace(); 
    } 
    psGet = null; 
    DSConnectionUtilExternal.closeConnection(con); 
} 

如果我刪除的方法closeConnection的jar文件的內容,聲納沒有檢測到連接未關閉。我認爲這很正常,聲納不會反編譯jar文件來訪問jar文件代碼。

所以問題是? 「資源應該關閉」規則使用什麼標準來確定連接是否在finally子句中關閉?

感謝

+2

您是否有充分的理由不使用試用資源? –

+0

使用的標準是引用類型是否實現(Auto)Closeable接口:您必須顯式地關閉它,或者使用try-with-resources。 –

+0

如果你關心拼寫檢查你的問題,那麼你會更加重視你。 –

回答

3
從你的問題

正確的假設:目前SonarJava(4.11剛剛發佈)不會做跨文件分析,並沒有關於在closeConnection方法發生了什麼線索。

但是,有關未關閉資源的規則具有簡單的啓發式方法,可以避免錯誤肯定性,因爲如果將資源傳遞給名爲close的方法,它們會關閉資源。

SonarJava正在努力讀取您的jar文件並理解資源已關閉,但這是一個複雜的功能,我們希望能夠在不久的將來實現。

+0

Hi @benzonico。非常感謝您的回答。現在很清楚。 – elamas

+0

爲了歷史的緣故,請接受答案,如果它是正確的。 – benzonico

+0

您好@benzonico,已完成 – elamas

相關問題