【问题标题】:Getting a null value on my arraylist.set(). using jsp在我的 arraylist.set() 上获取空值。使用jsp
【发布时间】:2015-12-31 08:57:36
【问题描述】:

我的目标是从 html 表单中添加单词,将它们存储在我的数组中,在页面中显示它们,并有两个链接一个用于删除项目,一个用于编辑项目(用于编辑的单词将输入另一个 html 表单)。

我正在使用 arrayList 来存储来自 Input 类型的输入。我能够添加和删除我的项目,但是当我尝试更改我的 arrayList 中项目的值时(我正在使用 arrayList.set()),我的值返回 null。如果我对 set() 进行硬编码,我会看到我的项目发生了变化,但由于某种原因,我无法从输入类型中获取值。想知道我错过了什么。

我有两个 jsp 页面。 main.jsp 和 edit.jsp。 一个具有所有验证的 java 类 WordOperations

这是我的代码 很抱歉,如果它很乱并且没有在这里显示。这是我第一次在stackoverflow上发帖

任何帮助将不胜感激。谢谢

这是我显示我的项目 main.jsp 的表单的代码

 <h3>Word List</h3>
        <form action="WordOperations" method="POST">
            Word: <input type="text" name="newWord">
            <input type="submit" value="Add">
        </form>
        <br/>

            <%
                ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");

                if (words!=null)
                {
                    for (int i=0; i<words.size(); i++)
                    {
                         out.println("<p>" +  "<a href='http://www."+ words.get(i) +".com'>" + words.get(i) +"</a>"  + "&nbsp;&nbsp;<a href='WordOperations?delete=" + i + "'>Delete</a>&nbsp;&nbsp;<a href='WordOperations?edit=" + i + "'>Edit</a></p>");

                    }
                }

            %>

这是我的代码,用于输入新信息的地方 edit.jsp

  <form action="WordOperations?" method="POST">
        New Link:<input type="text" name="userChange">
        <input type="submit" name="userChangePassword" value="Change link">
        </form>

这是验证我的表单 WordOperations.java 的代码

 HttpSession session = request.getSession();

        String newWord = request.getParameter("newWord");
        String delete = request.getParameter("delete");
        String edit = request.getParameter("edit");
        String newLink = request.getParameter("userChange");

        if (delete!=null) //delete a word
        {
            int delIndex = Integer.parseInt(delete);

            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.remove(delIndex);

            RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
            request.setAttribute("message", "Word deleted");
            rd.forward(request, response);  
        }
        else if(edit !=null)
        {   


            int edIndex = Integer.parseInt(edit);
            String link = newLink;
            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.set(edIndex,"google");
            words.add(newLink);
                         RequestDispatcher rd = getServletContext().getRequestDispatcher("/edit.jsp");


            request.setAttribute("message", "Word edited");
            rd.forward(request, response);

        }
        else //logging in
        {
            if (newWord!=null && !newWord.equals(""))
            {
                ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");

                words.add(newWord);              

                RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                request.setAttribute("message", "Word added");
                rd.forward(request, response);

            }
            else
            {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                request.setAttribute("message", "Word is required");
                rd.forward(request, response);
            }
        }

【问题讨论】:

  • 很难猜出这里到底发生了什么。您可以通过提供发生的堆栈跟踪并指出问题所在代码中的哪一行来改进您的问题。乍一看,我会说您从这里的会话ArrayList&lt;String&gt; words = (ArrayList&lt;String&gt;) session.getAttribute("words"); 中检索了ArrayList,我进一步猜测会话不包含属性words,因此该数组为空并在您尝试时导致 NullPointerException访问它。

标签: java jsp arraylist null set


【解决方案1】:

这是一个逻辑错误..

您正在运行 servlet WordOperations.java 两次 编辑单词并传递一次 edit 参数并在另一个中传递 userChange 参数和 NOT 一起解决问题。

这里是错误的。

但首先在会话中设置 Arraylist words 添加第一个单词。你可以这样做:

else //logging in
            {
                if (newWord != null && !newWord.equals("")) {
                    ArrayList<String> words = (ArrayList<String>) s.getAttribute("words");
                    if (words == null) {
                        words = new ArrayList<>();
                        words.add(newWord);
                        s.setAttribute("words", words);
                    } else {
                        words.add(newWord);
                    }

                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                    request.setAttribute("message", "Word added");
                    rd.forward(request, response);

                } 

现在这里是错误的:

Arraylist wordsmain.jsp 中列出时。它包含

word Delete_link Edit_link

现在 Delete_link > &lt;a href='WordOperations?delete=" + i + "'&gt;Delete&lt;/a&gt; 工作正常,因为您只是使用参数 delete = i 将其重定向到 WordsOperations.java 并从 ArrayList 中删除单词。

WordsOperations.java

String delete = request.getParameter("delete");

 if (delete!=null) //delete a word
        {
            int delIndex = Integer.parseInt(delete);

            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.remove(delIndex);

            RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
            request.setAttribute("message", "Word deleted");
            rd.forward(request, response);  
        }

但是

在 Edit_link > &lt;a href='WordOperations?edit=" + i + "'&gt;Edit&lt;/a&gt; 您正在调用 servlet WordsOperations.java 并仅使用参数 edit = iNOT 传递 userChange 参数。

因此newLink

上是NULL

String newLink = request.getParameter("userChange");

所以WordsOperation.java中的代码即

else if(edit !=null)
        {   


            int edIndex = Integer.parseInt(edit);
            String link = newLink;
            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.set(edIndex,"google");
            words.add(newLink);
                         RequestDispatcher rd = getServletContext().getRequestDispatcher("/edit.jsp");


            request.setAttribute("message", "Word edited");
            rd.forward(request, response);

        }

将被执行为edit!=nulltrue。但它会在 Arraylist words 中添加 newLink,这恰好是 NULL。因此 null 被添加到您的列表中。

Arraylist.set()方法没有问题。

现在在上面的代码中,您在添加newLink 后调用edit.jsp。 但是当从edit.jsp 表单调用WordsOperation.java 时,它只是传递了userChange 参数和NOT edit 参数,这是执行servlet WordsOperations.javaelse if(edit!=null) 块所必需的.

<form action="WordOperations?" method="POST">
            New Link:<input type="text" name="userChange">
            <input type="submit" name="userChangePassword" value="Change link">
        </form>

休息在你身上。只需注意将编辑和 UserChange 参数都传递给 Servlet WordsOperations.java 以完成工作。

建议:将edit参数传递给edit.jsp,然后将edit and UserChange参数传递给WordsOperation.java

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2013-03-08
    相关资源
    最近更新 更多