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

JSP List 存放 Map 循環變量覆蓋:作用域與引用陷阱

     編輯:程式設計綜合問答

JSP 中循環獲取 Map 值賦給 List 變量,因變量聲明在循環內導致每次迭代創建新引用,前一次數據丟失。將 List 聲明移至循環外並使用 add 累加可解決。

問題代碼


for (int i = 0; i < listMainBoard.size(); i++) {
    // ...
    List listSonBoard = (List) mapboard.get(new Integer(mainBoard.getBoardId())); // 循環內聲明
    // 每次迭代 listSonBoard 重新賦值,前一次引用丟失
    if (listSonBoard != null) {
        for (int j = 0; j < listSonBoard.size(); j++) {
            // ...
        }
    }
}

錯誤原因

  • List listSonBoard 在 for 循環內聲明
  • 每次迭代執行 List listSonBoard = ... 重新賦值
  • 前一次迭代的 List 對象無引用指向,被 GC 回收(若無其他引用)
  • 邏輯上想累加所有子版塊,實際只保留最後一次

修正方案


List allSonBoards = new ArrayList();  // 循環外聲明累加容器
for (int i = 0; i < listMainBoard.size(); i++) {
    Board mainBoard = (Board) listMainBoard.get(i);
    // ...
    List listSonBoard = (List) mapboard.get(new Integer(mainBoard.getBoardId()));
    if (listSonBoard != null) {
        allSonBoards.addAll(listSonBoard);  // 累加
        for (int j = 0; j < listSonBoard.size(); j++) {
            Board sonBoard = (Board) listSonBoard.get(j);
            // 處理每個子版塊
        }
    }
}
// 後續使用 allSonBoards 訪問所有子版塊

核心原則

  1. 累加容器聲明在循環外:生命周期覆蓋整個循環
  2. 循環內只獲取當前數據:List current = map.get(key)
  3. 使用 add/addAll 合併:而非重新賦值外層變量
  4. 避免變量遮蔽:內層循環勿重複聲明同名變量

JSP 最佳實踐補充

  • 業務邏輯移至 JavaBean/Servlet,JSP 僅負責展示
  • 使用 JSTL <c:forEach> 替代 Scriptlet
  • 泛型聲明:List listSonBoard 提高類型安全
  • 空值判斷:if (listSonBoard != null && !listSonBoard.isEmpty())
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved