2017-07-18 6 views
0

Avec ce code:Sonarlint multiple ferme

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 dit:

Fermer cette "PreparedStatement" dans une clause "enfin" sur la ligne 5 (req = ...)

Et quand je ferme req d'abord:

Fermer cette "connexion" dans une clause "enfin" sur la ligne 4 (connection = ...)

Comment puis-je faire SonarLint heureux?

Répondre

2

En supposant que vous utilisez java.sql.Connection, votre code peut toujours se retrouver avec des ressources qui ne sont pas fermées à la fin de l'exécution. Si vous regardez la signature de la méthode Connection.close() de Java 6 javadoc, vous verrez qu'elle peut lancer SQLException. Par conséquent, comme vous êtes déjà dans le bloc finally et si une exception se produit lors de la fermeture, votre code quittera la méthode sans fermer la demande. Maintenant, si vous inversez l'ordre de fermeture et commencez avec la demande, la même chose peut se produire. L'appel close() peut échouer, alors la connexion n'est jamais fermée, à partir du bloc finally, vous sautez à nouveau directement en dehors de la méthode.

Pour fermer les ressources correctement, je recommande de traiter comme ceci:

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(); 
    } 

}