【问题标题】:JSP throwing Null Pointer ExceptionJSP 抛出空指针异常
【发布时间】:2019-03-20 18:28:42
【问题描述】:

我不断收到空指针异常,但我无法从堆栈跟踪中准确判断是什么原因造成的。它似乎指向 DisplayAccounts.jsp 中的第 83 行,但该文件只有 48 行长... 登录后,LoginServlet 应该将用户定向到 DisplayAccounts.jsp

任何帮助将不胜感激。我好像搞不懂。

DisplayAccounts.jsp:

    <h1>Customer Accounts</h1>                
    <table>
        <tr>
            <th>Account Number</th>
            <th>Customer ID</th>
            <th>Account Type</th>
            <th>Account Balance</th>
        </tr>
    <% ArrayList accounts = (ArrayList)session.getAttribute("customer.list");
    for(int i = 0; i < accounts.size(); i++) {
        Account account = (Account)accounts.get(i); %>
        <tr>
            <td><% out.print(account.getAcctNo());%></td>
            <td><% out.print(account.getcID());%></td>
            <td><% out.print(account.getType());%></td>
            <td><% out.print(account.getBalance());%></td>
        </tr>
    <% } %>
    </table>

LoginServlet.java:

 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String id;
        String pw;
        int idDB;
        String pwDB;
        HttpSession session;
        try{
            id = request.getParameter("custID");
            pw = request.getParameter("pswd");
            System.out.println("ID: " + id);
            System.out.println("Password: " + pw);
            idDB = Integer.parseInt(id);

            Customer c1 = new Customer();
            c1.selectDB(idDB);
            pwDB = c1.getCustPassword();                
            // Add user to session
            session = request.getSession();
            session.setAttribute("customer", c1);
            System.out.println("User added to session");
            if (pw.equals(pwDB)){
                // Send user to account look up page
                RequestDispatcher rd = request.getRequestDispatcher("DisplayAccount.jsp");
                rd.forward(request, response);
            }

            else{
                // Send user to error page
                RequestDispatcher rd = request.getRequestDispatcher("ErrorPage.jsp");
                rd.forward(request, response);
            }
        }
        catch(ServletException e){
            System.out.println("A Servlet Excpetion has occured");
            System.out.println(e.getMessage());
            System.out.println(e.getStackTrace());
        }
        catch(IOException e){
            System.out.println("An IO Exception has occured");
            System.out.println(e.getMessage());
        }
        catch(Exception e){
            System.out.println("An error has occurred.");
            System.out.println(e.getMessage());
        }
    }

异常堆栈跟踪:

Info:   A Servlet Excpetion has occured
Info:   java.lang.NullPointerException
Info:   java.lang.NullPointerException
    at org.apache.jsp.DisplayAccount_jsp._jspService(DisplayAccount_jsp.java:83)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:875)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:739)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:575)
    at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:546)
    at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:428)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:378)
    at Chatt_Bank.LoginServlet.processRequest(LoginServlet.java:45)
    at Chatt_Bank.LoginServlet.doPost(LoginServlet.java:80)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 不,它指向DisplayAccount_jsp.java 中的第 83 行 - 从您的 JSP 编译的 Java servlet。
  • 您在 servlet 中使用 session.setAttribute("customer", c1);,但在 JSP 中使用 session.getAttribute("customer.list")

标签: java jsp


【解决方案1】:

这里

ArrayList accounts = (ArrayList)session.getAttribute("customer.list");

accounts 为空。您还没有使用 HttpSession 设置名称为 customer.list 的参数

HttpSession#setAttribute(String name, Object o)

(setAttribute) 在您的 LoginServlet#processRequest 方法中。那么,当

if (pw.equals(pwDB)){

您将转发到DisplayAccount.jsp没有该值。


你需要添加

session.setAttribute("customer.list", customerList);

你不能做你想做的事,你需要另一个属性

session.setAttribute("customerList", c1.list); // or c1.getList() if you have a getter

【讨论】:

  • 我明白了!这是有道理的,我明白我哪里出错了。感谢您指出这一点!我确实有一个后续问题。我输入“customer.list”的原因是因为列表是我的客户对象的一个​​属性(我认为它会以这种方式工作,我忘记了文字字符串是如何工作的)。我应该发送客户对象,然后遍历存储在客户列表属性中的对象列表。如何通过客户对象访问列表中的这些对象?我知道这可能会造成混淆,请告诉我如何以任何方式澄清
  • 谢谢!如此简单的修复。我觉得自己搞得这么糊涂很傻。谢谢!
  • @kotlinkitty 没问题。有时每个人都会遇到这种情况。
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 2020-08-10
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多