Java从ResultSet填充int[][]数组触发异常,请求技术排查协助
问题分析与修复方案
你的代码执行到循环就跳异常,主要是几个关键逻辑和写法问题导致的,咱们一步步梳理解决:
1. ResultSet遍历逻辑完全错误
你的SQL是按GameID查询单条数据,结果应该只有1行(包含A-H共8列),但你在嵌套循环里重复调用rs1.next():
for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { rs1.next(); // 第2次调用就会返回false,后续操作直接抛异常 char c = 'A'; char column = (char) (i + c); Arr[i][j] = rs1.getInt(column); } }
第一次rs1.next()能指向唯一的结果行,但嵌套循环会执行64次rs1.next(),从第2次开始next()返回false,此时再调用rs1.getInt()就会抛出SQLException(ResultSet已无可用行)。
如果你是要把单条数据的8列填充到数组的一行,正确逻辑应该是:
// 先确认有结果行 if (rs1.next()) { char baseCol = 'A'; for (int col = 0; col < 8; col++) { char colName = (char) (baseCol + col); Arr[0][col] = rs1.getInt(colName); // 填充数组第一行的8列 } }
如果你的SQL实际要返回8行数据(每行8列)来填充整个8x8数组,那应该这样写:
int rowIdx = 0; // 遍历ResultSet的每一行,最多取8行 while (rs1.next() && rowIdx < 8) { char baseCol = 'A'; for (int colIdx = 0; colIdx < 8; colIdx++) { char colName = (char) (baseCol + colIdx); Arr[rowIdx][colIdx] = rs1.getInt(colName); } rowIdx++; }
2. 异常信息输出太简陋
你现在只打印System.out.println(ex);,只能看到异常类名,完全不知道具体错误原因(是ResultSet越界?连接失败?还是列名写错?)。赶紧改成:
catch (Exception ex) { ex.printStackTrace(); // 打印完整异常栈,精准定位问题 }
这一步能帮你快速锁定到底是哪出了问题,非常关键。
3. 资源未关闭导致连接泄漏
你的代码没在finally块里关闭Connection、Statement、ResultSet,长期运行会耗尽数据库连接池资源,必须补上:
finally { try { if (rs1 != null) rs1.close(); if (st != null) st.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
4. SQL拼接存在安全风险(可选优化)
用字符串拼接GameID会有SQL注入风险,建议改用PreparedStatement:
String query = "select A,B,C,D,E,F,G,H from Games where GameID = ?"; // ... st = conn.prepareStatement(query); st.setInt(1, this.res); // 假设res是int类型 rs1 = st.executeQuery();
5. 连接问题排查
如果调整后还是跳异常,要检查getConnection()方法:
- 数据库URL、用户名、密码是否正确
- 数据库服务是否正常启动
- JDBC驱动是否正确加载
把这些问题修复后,你的代码应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Meirfe1
相关产品推荐
相关产品推荐

