2016-04-08 4 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 не сможет это узнать.

Это также плохой рисунок: что произойдет, если вы забудете позвонить queueToClose после получения ResultSet? 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; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^