You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:36:09