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
相关产品推荐
相关产品推荐

