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

JSP 分頁查詢空指針異常:ResultSet 作用域陷阱與修正方案

     編輯:程式設計綜合問答

錯誤現場

在 search_result.jsp 中使用 JDBC 連接 SQL Server 實現分頁,運行時拋出 NullPointerException,堆疊指向 rs.last() 或 rs.getRow()。

代碼片段(關鍵部分)

<%
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
    // ... 連接、查詢賦值 rs = stmt.executeQuery(strSql);
}catch(Exception e){
    // 空 catch 塊吞沒異常
}
%>
<%
// 此處 rs 為 null,因為 try 塊結束後區域變量 rs 已超出作用域
String str = (String)request.getParameter("page");
rs.last();  // NullPointerException
%>

根本原因

ResultSet rs 在 try 塊內聲明並賦值,屬於局部變量,try 塊結束後即銷毀。後續 Scriptlet 中引用的 rs 實為未初始化的外部變量(或根本不存在),導致空指針。

修正方案

  1. 擴大變量作用域:將 Connection、Statement、ResultSet 聲明在頁面頂層 <%! %> 宣告區,或使用頁面上下文屬性 pageContext.setAttribute("rs", rs) 傳遞。
  2. 採用 MVC 模式分離業務邏輯:在 Servlet 中完成查詢與分頁計算,將結果列表(List<Map>)存入 request 轉發給 JSP 純展示,徹底避免 JSP 中混寫 JDBC 代碼。
  3. 資源關閉要 finally:使用 try-with-resources(JDK 7+)或 finally 確保連接關閉,避免洩漏。

最佳實踐代碼結構

// Servlet
List<Student> list = studentDao.findByPage(page, pageSize);
request.setAttribute("students", list);
request.setAttribute("pageInfo", pageInfo);
request.getRequestDispatcher("/search_result.jsp").forward(req, resp);

JSP 僅遍歷 ${students} 渲染表格,邏輯清晰、易維護、無作用域陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved