2016-03-22 4 views
2

Sonarツールを使用して、Sonarルールを満たしていた既存のアプリケーションでコーディング標準を分析しています:Connectionのオブジェクトconnが原因の「リソースを閉じる」。finallyブロックのメソッドを使用して他のクラスの接続オブジェクトを閉じる

私たちが知っているように、conn.close();を使用してConnectionオブジェクトを閉じる必要がありますが、アプリケーションでは接続を解放するメソッドが呼び出されました。

以下は、最後にブロック内のreleaseConnection()という名前のメソッドでConnectionオブジェクトが閉じられているコードです。

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. 本当に私はソナーの提案に従う必要がある場合、何が最善の方法でなければならないのですか?

UPDATE:

どのように私はちょうど/バイパスにいくつかの特定のコードまたはルールを無視して、私の上記のコードに適用することができます。 Line:50を無視したいと言いますが、どうすればいいですか?

私は上記のコードを混乱させたくありませんが、私はこれを無視して問題を少なくしたいと考えています。前もって感謝します。

答えて

2

あなたが実際に(ボンネットの下にこのルールによって使用されている)シンボリック実行エンジンの限界に直面している:https://jira.sonarsource.com/browse/SONARJAVA-1591

ここで何が起こっている私たちは最終的には/のtry/catch内の実行の流れを近似ということです(フローの処理を簡略化するために)実行のパスをtryブロック全体をスキップさせることによって、あなたが挙げた偽陽性を招くことになります。

+0

返信いただきありがとうございます!だから、コードのこの特定の部分を無視する方法がありますか、またはソナーをfinallyブロックで呼び出されたメソッド{releaseConnection()}に移動させることができます。 Sonarの予期せぬ邪魔な制限です。 @ben – MonsterJava

+1

この非常に簡単な回避策はありません。問題を偽陽性としてマークする必要があります。動作に関しては、実行フローをエミュレートすることは例外的に非常に複雑な問題です。私たちは毎日エンジンを改善するよう努めています。 – benzonico

+0

素早い応答ありがとう@ben。あなたはオプション "私は偽陽性として問題をマークする必要があります"と私を助けることができます、あなたはソナーがこのタイプのオプションを提供することを意味しましたか? – MonsterJava

2

そうですよ!ソナーは、リソースをクローズするためにfinallyブロックからメソッドが呼び出されたかどうかをチェックしません。リソースのクローズをチェックするだけです。

関連する問題