Servlets 运行servlet的NullPointerException

Servlets 运行servlet的NullPointerException,servlets,nullpointerexception,Servlets,Nullpointerexception,)当我运行servlet时,我得到以下错误:有人能看到这是怎么回事吗?我正在尝试从表单中获取startDate和endDate。我想这和我的simpleDateFormat有关,但我看不出我做错了什么 java.lang.NullPointerException at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234) at java.text.DateFormat.parse(DateFormat.java:

)当我运行servlet时,我得到以下错误:有人能看到这是怎么回事吗?我正在尝试从表单中获取startDate和endDate。我想这和我的simpleDateFormat有关,但我看不出我做错了什么

java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:40)
    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$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
我的servlet如下所示:

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) 
        throws ServletException, IOException{

        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;

        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", ""); 
            //Getting the data from database

            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + " WHERE Date = ? AND Date = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);

            SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd");

            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );  
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );

            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );      
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
                System.out.println(req.getParameter("startDate"));                          
                System.out.println(req.getParameter("endDate"));
            //Show the result from database
                ResultSet rs = pst.executeQuery();

            float Allday_hours_sum = 0;
                while (rs.next()){                                      
                    Allday_hours_sum += rs.getFloat("Allday_hours"); 

                }   
                res.setContentType("text/html;charset=UTF-8");          
                res.getWriter().print(Allday_hours_sum); 

                pst.close();

        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
编辑代码:

PreparedStatement pst = connection.prepareStatement(sql);

            SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");

            java.util.Date util_startDate = format.parse( req.getParameter("startDate") );  
            java.sql.Date sql_startDate = new java.sql.Date( util_startDate.getTime() );

            java.util.Date util_endDate = format.parse( req.getParameter("endDate") );      
            java.sql.Date sql_endDate = new java.sql.Date( util_endDate.getTime() );

                pst.setDate( 1, sql_startDate );
                pst.setDate(2, sql_endDate );
                System.out.println(req.getParameter("startDate"));                          
                System.out.println(req.getParameter("endDate"));

你是如何提到like
pst.setDate(1,sql\u EndDate)的;pst.setDate(2,sql\u EndDate)它们在servlet页面中的名称相同。
我认为问题就在这里,你这样做是为了:

  pst.setDate( 1, sql_StartDate );
  pst.setDate(2, sql_EndDate );
您应该像servlet一样使用这种类型:

user.setDob(dob);
用户正在dao中执行以下类似插入部分的操作:

public void addUser(User user)
    preparedStatement.setDate(3, new java.sql.Date(user.getDob().getTime()));
采样代码

 SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd");
    Date startDate = fm.parse(req.getParameter("startDate"); 
    pst.setSDate(1,startDate);

 SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd");
    Date startDate = fm.parse(req.getParameter("endDate"); 
    pst.setEDate(2,startDate);

req.getParameter(“startDate”)
req.getParameter(“endDate”)
是否提供非空值?您可以使用调试器来查找。您好。谢谢你的回答。他们给了我打印件。输出:2014-03-02 2014-03-05所以应该是正确的,对吗?SimpleDataFormat.parse()需要日期格式,但它给了你一些不同的东西。hm一直在看它。在我看来,它给了med日期格式,但这当然是错误的:-/因为它不起作用。你能给我一个提示吗?请给我看看dao页面…嗯,这似乎是错的。但是谢谢你的时间和支持answer@Julie24,你是怎么说你犯了这个命名错误的?你必须改变它…看我的示例代码非常感谢你的时间:-)我不明白的是为什么pst.setDate(1,startDate);应为:pst.setDaaate(1,起始日期);