【问题标题】:may fail to clean up java.sql.ResultSet , Statement. Obligation to clean up resource is not discharged可能无法清理 java.sql.ResultSet , Statement。资源清理义务未解除
【发布时间】:2012-02-25 06:22:38
【问题描述】:

我在我的一个 java 文件中使用了 FindBugs 工具,并从工具中得到了下面提到的错误消息。

我在运行我的应用程序时确实发现了这个问题。我已经在Getting TDS driver - java.lang.NullPointerException. this exception is not consistent 上发布了这个。

我无法弄清楚为什么会这样。

1.)方法 com.vtech.tdpms.dao.ClientAuthenticationDAO.authenticateClient(InputBean) 可能无法清理 java.sql.ResultSet
清理在 ClientAuthenticationDAO.java 中创建的资源的义务:[第 44 行] 未解除

引用类型 java.sql.ResultSet
剩余 1 个实例类型的义务
路径在 ClientAuthenticationDAO.java 处继续:[第 45 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 46 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 61 行]
剩余义务:{Statement x 1, ResultSet x 1}

2.)方法 com.vtech.tdpms.dao.ClientAuthenticationDAO.authenticateClient(InputBean) 可能无法清理 java.sql.Statement
清理在 ClientAuthenticationDAO.java:[line 38] 处创建的资源的义务未解除
引用类型 java.sql.Statement
剩余 1 个实例类型的义务
路径在 ClientAuthenticationDAO.java 处继续:[第 39 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 40 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 41 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 42 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 43 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 44 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 45 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 46 行]
路径在 ClientAuthenticationDAO.java 处继续:[第 61 行]
剩余义务:{Statement x 1, ResultSet x 1}

Java 代码 -

 public class ClientAuthenticationDAO extends DAOUtil {       
 private static LogManager LOG = new LogManager(ClientAuthenticationDAO.class);

 public boolean authenticateClient(InputBean objInputBean) throws SQLException {  // line 30
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean isAuthenticationSuccess = false;

        try {
            conn = getConnection();
            ps = conn.prepareStatement(ClientAuthenticationQueryUtil.AUTHENTICATE_CLIENT);    // line 38
            ps.setString(1, objInputBean.getUsername());                 // line 39
            ps.setString(2, objInputBean.getPassword());                 // line 40
            ps.setString(3, objInputBean.getCompanyCode());              // line 41
            rs = ps.executeQuery();                                      // line 42

            while(rs.next())  {                                        // line 44
                if(GenTools.isEmpty(objInputBean.getClientId())){         // line 45
                    objInputBean.setClientId(rs.getString("login_xid"));  // line 46
                }                   
                objInputBean.setAdminId(rs.getInt("admin_id"));
                objInputBean.setLoginUserPID(rs.getInt("login_user_pid"));
                objInputBean.setUserType(rs.getString("user_type"));
                isAuthenticationSuccess = true;
            }

        } catch (SQLException sqlExp) {
            sqlExp.printStackTrace();
            LOG.fatal(sqlExp);
            throw sqlExp;
        } finally {
            DataBaseUtil.close(conn, ps, rs);
        }           

        return isAuthenticationSuccess;
    }

}

【问题讨论】:

  • 如果手动关闭 finally 块中的 ps 和 rs 会发生什么?即分别调用ps.close()rs.close()
  • 为什么这个问题被标记为NullPointerException?该标签似乎指的是另一个问题。
  • 在执行这段代码时,得到 NullPointerException - 请参考 - stackoverflow.com/q/9411706/147075
  • 我知道您正在获得 NPE,但这是一个 FindBugs 问题。

标签: java sql nullpointerexception findbugs


【解决方案1】:

我们在 Sonar 中有相同的消息。这是因为 findbugs 不知道 DataBaseUtil.close(conn, ps, rs); 实际上会关闭您的资源。 Findbugs 以相同的方法搜索对资源的实际调用。

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多