java.lang.NumberFormatException:null java.lang.Integer.parseInt(来源未知)

问题描述 投票:0回答:1

我正在尝试从 jsp 页面获取值,并希望使用 java 将这些值存储在 mysql(xampp) 数据库中。 连接已建立并成功登录,但当我尝试获取值时出现空指针异常

MainController.java

package classes;

import java.io.IOException;

import java.sql.Connection;

import java.sql.Date;

import java.sql.DriverManager;

//import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.Time;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

 * Servlet implementation class MainController

 */

@WebServlet("/MainController")

public class MainController extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**

     * @see HttpServlet#HttpServlet()

     */
    public MainController() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

     *      response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {




    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    }
    //@SuppressWarnings("null")
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String url= "jdbc:mysql://localhost/meeting_planner";
        System.out.println("start");
        // boolean stfound = false;

        try {
            System.out.println("reached controller");
            Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, "admin", "admin");

        Statement stmt = con.createStatement();
        //System.out.println("connection");
        String button=request.getParameter("button");
        System.out.println(button +  request.getParameter("AId"));




        if(button.equals("login"))
        {

            System.out.println("inside if");

            String  AdminId= request.getParameter("AId");
            String password= request.getParameter("Password");

            System.out.println(AdminId+"  sadia   "+password);

            if(!(AdminId=="" || password==""))
            {

                boolean stfound = false;

                System.out.println(AdminId+"  sadia   "+password);

                String query = "SELECT AId,Password FROM administrator";

                ResultSet rs = stmt.executeQuery(query);
                System.out.println(query);

                while(rs.next())
                {

                    String dbadminid = rs.getString(1);
                    String dbadminpwd = rs.getString(2);

                    if(AdminId.equals(dbadminid) && password.equals(dbadminpwd))
                    {
                        HttpSession session = request.getSession(true);
                        session.setAttribute("userid",dbadminid);
                        stfound = true;
                        break;
                    }
                }




        if(stfound){
             RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/meeting_Id.jsp" ) ;

             dispatcher.forward ( request, response ) ;

            }
        }
            else{
                RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/index.jsp" ) ;

                dispatcher.forward ( request, response ) ;

            }
            }
        if(button.equals("Next"))
    {

        HttpSession session = request.getSession(true);
        String AID =(String) session.getAttribute("aid");


        int meetingid = Integer.parseInt(request.getParameter("meeting_id"));
        /*String CNM= request.getParameter("CNM");
        int CCD = Integer.parseInt(request.getParameter("CCD"));
        int  CCDD= Integer.parseInt(request.getParameter("CCDD"));
        int PID= Integer.parseInt(request.getParameter("PID"));
        int STFID=Integer.parseInt(AID);*/

        meeting obj=new meeting();
        obj.addmeeting(meetingid);

        System.out.print("Sadia");

        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/creat_date.jsp" ) ;

        dispatcher.forward ( request, response ) ;
    }
    }catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    }
}

Meeting.java 是

package classes;

import java.sql.Connection;

import java.sql.Date;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Time;

import java.sql.Statement;

public class meeting {

    private int meeting_id;
    Connection con=null;
    Statement smt = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
    public meeting()throws ClassNotFoundException//construtor
        , SQLException{
            //  try{
            String url = "jdbc:mysql://localhost/meeting_planner";
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(url, "admin", "admin");

            smt = con.createStatement();

            //}catch(ClassNotFoundException e1){
            //e1.printStackTrace();
        }
        public void addmeeting(int meeting_id1)throws ClassNotFoundException  // from attribute web.xml
            , SQLException{
                System.out.println("------TRY INSERTION------"); 


                String query = "SELECT meeting_Id FROM meeting";
                ResultSet rs = smt.executeQuery(query);
                int numCols = rs.getMetaData().getColumnCount()+1;
                //  STAFF_ID=numCols+1;

                String query1 = "INSERT INTO Meeting VALUE ( "+meeting_id+")";
                System.out.println(query1); 
                smt.executeUpdate(query1);

            }
        }

下一步按钮的名称是“下一步” 当我在这一行打印

next
的值时
System.out.println("next"+next);
它为下一个参数打印 null

** 编辑:NullPointerException 的问题已解决,但现在抛出 NumberFormatException **

控制台是这样的

start

reached controller

inside if

111  sadia   sadia

111  sadia   sadia

SELECT AId,Password FROM administrator

start

reached controller

Oct 29, 2014 6:44:57 PM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet [classes.MainController] in context with path [/Meeting1] threw 

exception

java.lang.NumberFormatException: null

    at java.lang.Integer.parseInt(Unknown Source)

    at java.lang.Integer.parseInt(Unknown Source)

    at classes.MainController.doPost(MainController.java:141)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

    at 

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)

    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)

    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)

    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)

    at 

org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)

    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

    at java.lang.Thread.run(Unknown Source)

index.jsp 是

<form method = "post" name="create" action="MainController">

                                    <label for="author">Enter id: </label> <input type="text"
                                        id="AId" name="AId" required="required" />
                                    <div class="cleaner_h10"></div>
                                    <label for="author">Enter_password: </label><input
                                        type="password" name="Password" required="required" />
                                    <div class="cleaner_h10"></div>
                                    <br>  <input type="submit"
                                            name="button" " value="login"
                                            style="height: 30px; width: 70px"></a>
                                             </input>

                                </form>

meeting_Id.jsp 是

<form method="post" name="create" action="MainController">

                    <label for="author">Enter Meeting Id:</label> <input type="text" id="meeting_id" name="mid" required="required" />
                    <div class="cleaner_h10"></div>


                    <div class="cleaner_h10"></div><br>

            <input type="submit" name="cancelbutton" value="Cancel" style="height:30px; width:70px">
            </input>
            <input type="submit" name="button" value="Next" style="height:30px; width:70px">
            </input>
                </form>
java mysql jsp
1个回答
0
投票

原NullPointerException问题的解决方案

问题就在这里:

    //System.out.println("connection");
    String button=request.getParameter("button");
    System.out.println(button +  request.getParameter("AId"));




    if(button.equals("login"))

从您自己的调试打印中可以看到,您打印的

button
和参数
AId
都是空。

因此,当您尝试调用

button.equals("login")
时,您会收到 NullPointerException。那是因为你不能在 null 上调用方法。

在使用参数之前,您应该始终检查参数是否为

null
。即使您认为它们永远不应该是
null
- 因为黑客可以尝试在不控制您的表单的情况下向您的 servlet 发送内容。

这是一步一步发生的事情。

  1. 您显示
    index.jsp
    。您点击按钮。
  2. 主控制器运行。由于有一个来自
    button
    index.jsp
    参数,所以一切正常,并且它到达最后的代码,将其转发到现在显示在浏览器上的
    meeting_Id.jsp
  3. 您现在单击按钮并将
    meeting_Id.jsp
    中的表格发送回
    MainController
  4. 现在,在这个调用中,没有参数
    button
    。因此你会得到 NullPointerException。

您正在 MVC 环境中工作。每个表单都会发送到同一个控制器

MainContoller
,并且
MainController
应该足够聪明,能够知道哪个表单向其发送了请求,并相应地进行处理。但你的假设只有
index.jsp
正在调用它。但它不是这样工作的。当您单击
next
上的
meeting_Id.jspa
按钮时,您正在创建一个 新请求,该请求将发送到同一个
MainController
servlet,并导致错误。

您应该确保您的表单发送某种 ID,告诉

MainController
目前哪个表单正在使用它,然后控制器可以发送请求以由适当的模型处理。您使用它的输入应该具有相同的名称,并且应该存在于您发送的所有表单中。

NumberFormatException的解决方案

现在您由于不同的原因遇到了类似的问题。在这一行中:

 int meetingid = Integer.parseInt(request.getParameter("meeting_id"));

您正在尝试解析一个名为

meeting_id
的参数。问题是,您没有检查空值。你实际上没有这样的参数。

为什么?因为这就是您的 HTML(在

meeting_Id.jsp
中)所说的:

<input type="text" id="meeting_id" name="mid" required="required" />

如您所见,“meeting_id”是其 id,而不是其 name,并且

getParameter()
始终与输入的
name
配合使用。

除此之外,修复此问题后,您必须(使用正则表达式)确保参数中仅包含数字,或者必须在

NumberFormatException
行周围使用 try-catch 块来捕获
parseInt

始终、始终检查从用户那里获得的参数。永远不要假设它们存在,它们不为空,或者它们具有您期望它们具有的值。

© www.soinside.com 2019 - 2024. All rights reserved.