SonarLint по-прежнему показывает ошибки блокировщика, хотя мы обработали оператор, соединение закрывается в блоке finally - PullRequest
0 голосов
/ 29 мая 2018

SonarLint показывает следующие ошибки:

  1. 'Использовать try-with-resources или закрыть это "Statement" в предложении "finally".'
  2. 'Использовать try-with-ресурсы или закройте это «Соединение» в предложении «finally». Ошибки блокировщика
    , даже если мы закрыли оператор Statement stmt, Соединение con в блоке finally.

Пожалуйста, найдите пример кода.

public String getProductNumber() throws BusinessDelegateException {

        String productNo = null;
        Connection con = null;
        Statement stmt = null;
        ResultSet   rs  = null;
        String query  = //some query
        try {
            DataSource ds = getDataSource();
            con = ds.getConnection();
            stmt = con.createStatement();
            rs   = stmt.executeQuery(query);
            productNo =.......
            ....................
        }catch (Exception e) {
            String errorMsg = "Error occured in getProductNumber()";
            throw new BusinessDelegateException(errorMsg, e);
        }finally{
            try {
                if(rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (con != null)
                    con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return productNo;
    }

Мы смогли решить эту проблему, изменив блок finally следующим образом.Но все равно похоже на повторение блоков улова.Есть ли другой способ исправить это?

finally{
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (stmt != null)
                stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (con != null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

1 Ответ

0 голосов
/ 30 мая 2018

Без try-with-resources вы можете улучшить код только с помощью методов повторного использования, вызовите метод main:

closeResources(rs, stmt, con);

, который будет вызывать каждый для каждого ресурса свой метод, например Statement:

 public void closeResource(Statement stmt) {
    if (stmt != null) {
        stmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

Кстати, лучше использовать регистратор вместо e.printStackTrace ()

Для полного решения вы можете проверить подробный пример , которыйдобавить ресурсы в массив и закрыть их в цикле:

for (Closeable resource : resources) {
   try {
     resource.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...