在if-else逻辑中使用PreparedStatement出现Index 1越界错误求助
解决PreparedStatement报“Index 1 is out of range”的问题
这个错误在使用PreparedStatement时特别常见,本质就是你的SQL语句里的占位符(?)数量,和你实际尝试设置的参数索引/数量不匹配。结合你贴的代码片段来看,大概率是这几个原因导致的:
1. 分支SQL的占位符不一致,后续统一设置参数触发越界
看你的代码逻辑,不同分支会生成不同的SQL:
- 第一个分支(width和height都为空):SQL是
select * from dbo.Table,没有任何占位符 - 第二个分支:你用
query += "..."拼接了带条件的SQL(应该是带?的,比如where width=? and height=?)
如果后续你不管哪个分支,都统一执行了ps.setString(1, width)或者ps.setString(2, height)这类设置参数的代码,那第一个分支的PreparedStatement根本没有对应的占位符,自然会抛出“索引超出范围”的错误。
2. 拼接SQL的逻辑漏洞
比如第二个分支的query += "..."里,可能少写了占位符,或者多写了,但设置参数时的数量没对应上;另外你的空值判断可以优化(比如先trim再判断是否为空,避免用户输入空格导致的误判),不过这不是核心问题。
修复示例代码
给你调整后的可运行逻辑,每个分支的SQL和参数设置严格对应:
try { // 先trim避免空格干扰空值判断 String width = jFormattedTextField1.getText().trim(); String height = jFormattedTextField2.getText().trim(); PreparedStatement ps; String query; if (width.isEmpty() && height.isEmpty()) { query = "select * from dbo.Table"; ps = connection.prepareStatement(query); // 无占位符,不需要设置参数 } else if (!width.isEmpty() && !height.isEmpty()) { query = "select * from dbo.Table where width = ? and height = ?"; ps = connection.prepareStatement(query); ps.setString(1, width); ps.setString(2, height); } else { // 补充处理「只有width或只有height不为空」的场景 if (!width.isEmpty()) { query = "select * from dbo.Table where width = ?"; ps = connection.prepareStatement(query); ps.setString(1, width); } else { query = "select * from dbo.Table where height = ?"; ps = connection.prepareStatement(query); ps.setString(1, height); } } // 执行查询并处理结果集 ResultSet rs = ps.executeQuery(); // ... 你的结果集处理逻辑 } catch (SQLException e) { e.printStackTrace(); }
额外注意事项
- 每个分支的SQL要和参数设置严格对应:有几个
?就设置几个参数,索引从1开始计数 - 尽量避免零散的SQL拼接,复杂条件可以考虑用CriteriaQuery或者MyBatis这类支持动态SQL的框架,减少手动拼接的出错概率
- 空值判断优先用
trim()+isEmpty(),避免用户输入空格导致的逻辑错误
内容的提问来源于stack exchange,提问作者n0rek
相关产品推荐
相关产品推荐

