首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java ResultSet 讀取邏輯缺陷導致數組僅首元素有值的問題分析

     編輯:程式設計綜合問答

在 JDBC 處理 ResultSet 時,若在循環中未正確推進游標或錯誤嵌套循環,會導致數組除首元素外全為默認值(0/null),進而引發後續計算錯誤。

問題代碼還原

// 讀取 rs2
for (int i = 0; i < numbercanshu; i++) {
    while (rs2.next()) {  // 游標推進到末尾
        list2[i] = rs2.getInt("教師等級");  // i 不變,反覆覆寫 list2[0]
        list4[i] = rs2.getInt("教學崗位標准");
    }
}  // 循環結束時,rs2 游標已在 afterLast,只有 list2[0] 有值

// 讀取 rs
for (int n = 0; n < number; n++) {
    list3[n] = rs.getInt("級別");
    break;  // 直接跳出,只有 list3[0] 有值
}

// 後續雙層循環遍歷 list2、list3,實際僅比較 [0] 元素

核心缺陷

  1. 外層 for 循環與內層 while 邏輯顛倒:while(rs.next()) 應在外層驅動行遍歷,內部按列賦值;現代碼導致單行數據反覆寫入同一索引。
  2. 無條件 break:第二個循環首次迭代即中斷,僅讀取第一行。
  3. 未檢查 ResultSet 狀態:首次 while 耗盡 rs2,後續無法重複讀取(除非 TYPE_SCROLL_INSENSITIVE)。

修正版讀取邏輯

// 假設 numbercanshu 為預期行數,實際以 ResultSet 為準
int i = 0;
while (rs2.next() && i < numbercanshu) {
    list2[i] = rs2.getInt("教師等級");
    list4[i] = rs2.getInt("教學崗位標准");
    i++;
}
int actualCount2 = i;  // 實際讀取行數

int n = 0;
while (rs.next() && n < number) {
    list3[n] = rs.getInt("級別");
    n++;
}
int actualCount3 = n;

// 計算時使用實際計數
for (int x = 0; x < actualCount2; x++) {
    for (int y = 0; y < actualCount3; y++) {
        if (list2[x] == list3[y]) {
            money[y] += list4[x];
        }
    }
}

最佳實踐建議

  • 優先使用 List<Integer> 替代固定長度數組,動態擴容避免越界與空值。
  • 使用 try-with-resources 確保 Connection/Statement/ResultSet 正確關閉。
  • 若需多次遍歷結果集,查詢時設置 ResultSet.TYPE_SCROLL_INSENSITIVE,或將數據先載入集合。
  • 調試時打印 rs.getRow()、list.size() 確認讀取行數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved