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

JUnit测试失败排查:SQL语句正确但Eclipse中测试报错

问题分析与解决

首先看你的错误追踪信息,核心错误点非常明确:

com.microsoft.sqlserver.jdbc.SQLServerException: The index 2 is out of range.

这个错误的意思是:你调用了类似setString(2, ...)的参数设置方法(索引用了2),但对应的PreparedStatement SQL语句里只有1个?占位符,所以索引2超出了有效范围。

注意到错误栈里指向的是JDBC.java:43的MostShipsSunkInBattle方法,而你贴出来的是ShipYearLaunched方法——这说明你贴的代码并不是实际报错的那一段。你需要立刻去检查MostShipsSunkInBattle方法:

  • 先确认该方法里的SQL语句有几个?占位符
  • 再核对你调用setString(或其他setXxx方法)时用的索引,是否和占位符的位置对应(SQL参数索引从1开始计数)

举个简单的例子:
如果你的SQL是:

SELECT count(*) FROM Battles WHERE ship_name = ?

那只能用setString(1, shipName);但如果错误地调用了setString(2, someValue),就会触发当前的索引越界错误。

另外,顺便提一下你贴的ShipYearLaunched方法里的两个潜在问题(虽然不是当前报错的原因,但会导致后续其他异常):

  • 查询的是Launched列,但取结果时用了rs.getInt("c"),这里应该改成rs.getInt("Launched"),否则会报列不存在的错误
  • 直接调用rs.next()后就取数据,没有判断结果是否存在:如果数据库里没有匹配ship的记录,rs.next()会返回false,此时调用rs.getInt()会抛出异常,建议修改为:
    if (rs.next()) {
        return rs.getInt("Launched");
    } else {
        // 处理无匹配数据的情况,比如返回-1或者抛自定义业务异常
        return -1;
    }
    

内容的提问来源于stack exchange,提问作者Usama Hameed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:31