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

Servlet NullPointerException 排查:定位堆疊行號

     編輯:程式設計疑難解答

錯誤堆疊:

java.lang.NullPointerException
at org.apache.struts2.ServletActionContext.getRequest(ServletActionContext.java:112)
at stu.action.SelectAction.<init>(SelectAction.java:29)

直接定位

  1. SelectAction.java:29 行在建構子中呼叫 ServletActionContext.getRequest()。
  2. Struts 2 的 ServletActionContext.getRequest() 依賴 ThreadLocal 保存的 HttpServletRequest,建構子執行時請求尚未注入,取得 null。
  3. 後續對 null 呼叫方法 → NPE。

修正原則

  • Action 建構子不可使用 Servlet API(request、session、response)。
  • 移至 execute()、prepare() 或 setServletRequest()(實作 ServletRequestAware)中。

修正範例

public class SelectAction extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest request) {
        this.request = request; // 這裡 request 已就緒
    }
    public String execute() {
        // 安全使用 request
        String param = request.getParameter("id");
        ...
    }
}

補充

若用 Spring 管理 Action,確保 scope="prototype",否則單例模式下建構子只執行一次,更不可用請求相關資源。

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