Java 7中try-with-resources使用时PreparedStatement参数设置位置如何调整
问题原因
- try-with-resources 括号内的资源初始化语句会按书写顺序同步执行,你在初始化
PreparedStatement后直接调用了executeQuery()执行查询,此时还没给SQL的占位符设置参数,所以查询直接报错。 - 你代码里初始化的
Statement没有被使用,属于冗余代码,可以直接删除。
修正方案
将ResultSet的初始化逻辑移到try代码块内部,完成参数设置后再执行查询获取结果集,Java 7及以上版本支持嵌套的try-with-resources结构,内层的ResultSet同样会被自动关闭,完全满足SonarQube的资源自动回收要求,修改后的代码如下:
try (Connection connection = DriverManager.getConnection(connectionUrl); PreparedStatement sentence = connection.prepareStatement(selectSql)) { // 先给PreparedStatement设置参数 sentence.setString(1, parametro); // 再执行查询获取结果集 try (ResultSet resultSet = sentence.executeQuery()) { logger.info(resultSet + " resultSet!----------------------------------------"); // 打印结果集内容 while (resultSet.next()) { logger.info(" Entro al While!----------------------------------------"); euroList.add(new EuroModel(resultSet.getInt("ID"), resultSet.getString("RFC"), resultSet.getString("NOM"))); logger.info("recibiendo result-> " + resultSet.getString(2) + " " + resultSet.getString(3)); logger.info(euroList.toString()); } } } catch (SQLException e) { logger.info("No se pudo conectar"); logger.info("EuroService"); logger.info("INFO: " + e); // 建议返回空集合而非null,避免调用方出现空指针异常 return Collections.emptyList(); }
内容的提问来源于stack exchange,提问作者Erick Finn
相关产品推荐
相关产品推荐

