2016-04-08 75 views
1

我有一個像波紋管代碼段:可能Findbug假陽性 「obl_unsatisfied_obligation」

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沒有辦法知道這一點。

這也是一種不好的模式:如果您在獲得ResultSet後忘記致電queueToClose會發生什麼? UnitOfWork.getStatement()在返回之前是否將語句添加到queueToClose

更好的將是

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

除了出色的答案是「阿列克謝·羅曼諾夫」張貼有在您的實現UnitOfWork.close的潛在泄漏,其中是否有這些收市話費的拋出異常的連接未關閉。

@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; 
     } 
    } 
}