2016-04-08 10 views
1

私は怒鳴るようなコードのセクションがあります。「obl_unsatisfied_obligation」のための正の可能性Findbug偽

try (UnitOfWork unitOfWork = datasource.getConnection()) { 
    ResultSet resultset = untiOfWork.getStatement().getResultSet(); 
    unitOfWork.queueToClose(resultSet); 
    ... 
} 

たUnitOfWorkはAutoClosableです。だから、UnitOfWorkclose()方法の内側に、このようなものです。

@Overide 
public void close() { 
    for (AutoClosable closable : queueToClose) { 
     closable.close(); 
    } 
    connection.close(); 
} 

ここで、FindBugはResultSetがクローズされていないと不平を言っています。これは偽陽性ですか?これは悪いパターンですか?

答えて

1

ResultSetが閉鎖されるという意味で、偽陽性であるが、FindBugsのは、このことを知るための方法はありません。

また、悪いパターンです。を取得した後にqueueToCloseに電話するのを忘れた場合はどうなりますか? UnitOfWork.getStatement()はそれを返す前にqueueToCloseにステートメントを追加していますか? 「アレクセイ・ロマノフ」は、それらの近くの呼び出しのいずれかが例外をあなたの接続をスローした場合UnitOfWork.closeの実装における潜在的な漏れがある掲示することを

ベター優れた答えに加えて

try (UnitOfWork unitOfWork = datasource.getConnection(); 
    Statement statement = unitOfWork.getStatement(); 
    ResultSet resultset = statement.getResultSet()) { 
    ... 
} 
2

だろう閉じていない。

@Override 
public void close() throws Exception { 
    Exception first = null; 
    try (AutoCloseable requiredForJdk8 = this.connection) { 
     for (AutoCloseable closable : this.queueToClose) { 
      try { 
       closable.close(); 
      } catch (Exception e) { 
       if (first == null) { 
        first = e; 
       } else { 
        if (first != e) { 
         first.addSuppressed(e); 
        } 
       } 
      } 
     } 
     if (first != null){ 
      throw first; 
     } 
    } 
} 
関連する問題