2016-05-30 2 views
1

У меня есть класс DAO с методами получения и отправки данных.Ошибка Findbugs «Загрузка известного нулевого значения» SQL-соединение

Я ломаю исключения в запросах SQL, поэтому мне нужно объявить переменные соединения вне скобки.

каждый метод выглядит lookes так:

public Role getRole(int roleId) { 
    Connection connection = null; 
    ResultSet rs = null; 
    PreparedStatement statement = null; 
    Role role = null; 

    try { 
     connection = dataSource.getConnection(); 
     statement = connection.prepareStatement("select ROLE_ID, ROLE_TEXT from ROLES WHERE ROLE_ID = :1"); 
     statement.setInt(1, roleId); 
     rs = statement.executeQuery(); 
     rs.next(); 
     role = roleMapper.mapRow(rs, 1); 
    } catch (SQLException e) { 
    } finally { 
     JdbcUtils.closeResultSet(rs); 
     JdbcUtils.closeStatement(statement); 
     JdbcUtils.closeConnection(connection); 
     return role; 
    } 
} 

Но есть проблема. Finbugs дает мне ошибку, говоря:

Load of known null value in DAO.getRole

и

may fail to clean up java.sql.Statement 

Так что я должен сделать, чтобы избежать этого?

+1

Никогда не поймать исключение без обработки его – Jens

+0

в какой строке вы получаете ошибки? – Jens

+0

Pls отправил сообщение об ошибке – Blobonat

ответ

0

GetRole может возвращать null. Кроме того:

if (rs.next()) { 
    role = roleMapper.mapRow(rs, 1); 
} 

Я предпочитаю другое обозначение. И решение об ошибке, к сожалению, состоит либо позволить getRole бросить исключение (лучше) или позволить вернуть Optional<Role>

//public Role getRole(int roleId) throws SQLException { 
public Optional<Role> getRole(int roleId) { 
    try (Connection connection = dataSource.getConnection(); 
      PreparedStatement statement = 
       connection.prepareStatement(
       "select ROLE_ID, ROLE_TEXT from ROLES WHERE ROLE_ID = :1")) { 
     statement.setInt(1, roleId); 
     try (ResultSet rs = statement.executeQuery()) { 
      if (rs.next()) { 
       return roleMapper.mapRow(rs, 1); 
      } 
     } 
    } catch (SQLException e) { // 
     Logger.getLogger(getClass().getName()).log(Level.SEVERE, "ID: " + roleId, e); // 
    } 
    return Optional.empty(); // 
}