5

私たちのコード ベースでは、次のようなコードでルール squid:S2095 の Sonar レポート違反が発生します。

    PreparedStatement ps = null;
    try {
        ps = connection.prepareStatement(DML); 
        ps.setString(1, externalDeviceId);
        ps.setInt(2, internalDeviceId);
        ps.execute();
        return ps.getUpdateCount() > 0;
    } finally {
        Utilities.close(ps);
    }

Utilities.close を次のように実装

    public static final void close(final AutoCloseable ac) {
        if(ac != null) {
            try {
                ac.close(); 
                } catch(Exception e) {
            }
        }
    }

これらの誤検知を回避する方法はありますか?

4

2 に答える 2

4

Java 7 以降を使用している場合、リソース自体を閉じることができる try-with-resources を使用する非常に簡単な方法があり、それについてはもう気にする必要はありません。チュートリアルのtry (PreparedStatement ps = connection.prepareStatement(DML))を参照してください: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (PreparedStatement ps = connection.prepareStatement(DML)) {
    ps.setString(1, externalDeviceId);
    ps.setInt(2, internalDeviceId);
    ps.execute();
    return ps.getUpdateCount() > 0;
}
于 2016-04-12T13:55:49.383 に答える
3

短い答えですが、今のところそれらを回避する方法はありません。

より長い答え: 通常、開かれた値をメソッドに渡す場合、誤検知を避けるために閉じたものとしてマークする必要があります。使用しているソナー Java プラグインのバージョンを正確にする必要があります。

このルールはシンボリック実行エンジンに依存しており、メソッドの境界に限定されているため、このユーティリティ メソッドの呼び出しが開いているリソースを確実に閉じるかどうかを現時点で判断する方法はありません。

ただし、ソナーの Java チームは、この制限をなくすために取り組んでいることに注意してください。

于 2016-04-12T13:29:02.540 に答える