2017-07-07 20 views
2

これは質問ですが問題ありません。"リソースを閉じてください"というルールはどのようにして接続が閉じられていることを確認しますか?

DSConnectionUtilExternalというクラスがありますが、データベース接続を取得するメソッドとそのメソッドを閉じるメソッドがあります。このクラスはjarファイルにあります。

一方私は依存関係としてjarファイルを含むプロジェクトを持っています。私はjarファイルでメソッドcloseConnectionの内容を削除した場合 はこのの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); 
} 

を持って、ソナーは、接続が閉じていないことを検出しません。私はそれが正常だと思う、ソナーはjarファイルのコードにアクセスするためにjarファイルを逆コンパイルしません。

質問は?最終節で接続が閉じられているかどうかを判断するために、「リソースは閉じているべきですか?」ルールで使用される基準は何ですか?あなたの質問から

おかげ

+2

リソースを試してみることをお勧めしない理由はありますか? –

+0

基準は、参照型が(自動)Closeableインタフェースを実装するかどうかです:明示的に 'close()'するか、try-with-resourcesを使用する必要があります。 –

+0

あなたの質問をスペルチェックするのが気になるならば、もっと真剣に受け止めるより高い可能性があります。 –

答えて

3

正しい仮定:現時点でSonarJava(4.11がリリースされたばかりの)クロスファイル解析を行うと、あなたのcloseConnection方法で何が起こっているかについての手掛かりを持っていません。

ただし、閉包されていないリソースに関するルールは、closeという名前のメソッドに渡された場合、リソースが閉じられたとみなす誤認を回避する簡単なヒューリスティックを持っています。

SonarJavaは、あなたのjarファイルを読むことができるようになり、リソースはそこに閉じられていると理解していますが、それは複雑な機能であり、近い将来に提供することを願っています。

+0

こんにちは@benzonico。ご回答どうもありがとうございました。今は明らかです。ヒストリーのために – elamas

+0

正しい場合は答えを受け入れてください。 – benzonico

+0

こんにちは@benzonico、done – elamas

関連する問題