2017-07-18 4 views
0

を閉じます。Sonarlintの倍数は、このコードで

Connection connection = null; 
PreparedStatement req = null; 
try { 
    connection = DriverManager.getConnection(url, user, password); 
    req = connection.prepareStatement(SQL); 
} finally { 
    if (connection != null) { 
     connection.close(); 
    } 
    if (req != null) { 
     req.close(); 
    } 
} 

SonarLintは言う:

は5行目(req = ...)の "最終的に" 句で、この "PreparedStatementを" 閉じ

そして、私が閉じるときreq最初:

がどのように私はSonarLintを幸せにすることができます(connection = ...)4行目に「ついに」句で、この「接続」を閉じますか?

答えて

2

java.sql.Connectionを使用していると仮定すると、実行終了時にリソースが閉じられなくなる可能性があります。

メソッドのシグニチャをJava 6 javadocから見ると、SQLExceptionがスローされることがわかります。その結果、既にブロックされているので、終了時に例外が発生した場合、コードは要求を閉じることなくメソッドを終了します。

近い順序を逆転して要求で開始すると、同じことが起こる可能性があります。 close()を呼び出すと失敗する可能性があります。最後にメソッドから直接飛び越したブロックから接続が閉じられることはありません。

適切に両方のリソースをクローズするために、私はこのようにそれに対処することをお勧めします:

Connection connection = null; 
try { 
    connection = DriverManager.getConnection(url, user, password); 
    PreparedStatement req = null; 
    try { 
    req = connection.prepareStatement(sql); 
    } finally { 
    if (req != null) { 
     req.close(); 
    } 
    } 
} finally { 
    if (connection != null) { 
    connection.close(); 
    } 

} 
関連する問題