500错误所需的疑难解答帮助(Java)

500错误所需的疑难解答帮助(Java),java,servlets,cookies,Java,Servlets,Cookies,我正在上一门java课程,我遇到了麻烦。在执行这段代码之前,我创建了一个cookie,它将发货号存储为cookie名称,发货日期存储为cookie值 然后,表单要求用户输入一个确认号码。以下代码应: 将键入的字符串转换为整数 检索保存的Cookie并将名称转换为整数 将键入的号码与保存的cookie号码进行比较 如果键入的数字和保存的数字相同,它将以字符串形式检索日期的cookie值 然后将cookie值转换为日历日期值 然后将日期值与今天的日期进行比较 如果发货编号有效且与存储的cookie匹

我正在上一门java课程,我遇到了麻烦。在执行这段代码之前,我创建了一个cookie,它将发货号存储为cookie名称,发货日期存储为cookie值

然后,表单要求用户输入一个确认号码。以下代码应:

将键入的字符串转换为整数 检索保存的Cookie并将名称转换为整数 将键入的号码与保存的cookie号码进行比较 如果键入的数字和保存的数字相同,它将以字符串形式检索日期的cookie值 然后将cookie值转换为日历日期值 然后将日期值与今天的日期进行比较 如果发货编号有效且与存储的cookie匹配,并且日期比发货日期早5天以上,则用户将收到取消消息。如果没有,则用户将收到另一条消息。 还有一些事情可以避免显而易见的事情: -是的,我知道在现实生活中这会存储在数据库中。这是一个类分配,我们目前不使用数据库。 -我知道我没有考虑任何用户输入。我会在代码运行后再讨论这个问题

下面的代码抛出了一个500错误,我不知道为什么。它编译得很好:

/*
 * cancelOrder servlet looks for the cookies associated
 * with the shopping cart confirmation page
 */

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.TimeUnit;

public class cancelOrder extends HttpServlet {

    //sets initial values for what we will retrieve
    //from the cookie
    int confirmNumber = 0;
    String shippingDate = "01/01/2000";
    Date date;

/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
public static long getDateDiffInDays(Date date1, Date date2) {
    long diffInMillis = date2.getTime() - date1.getTime();
    return TimeUnit.MILLISECONDS.toDays(diffInMillis);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
    //gets the fields that the user filled
    String enteredConfirmNumber = request.getParameter("ConfirmationNumber");


    //converts confirmNumber from string
    //to integer 
    int enteredConfirmNo = Integer.parseInt(enteredConfirmNumber);

    //gets cookie value if it matches user input
    Cookie[] cookies = request.getCookies();
    Cookie cookie;
    for(int i=0; i<cookies.length; i++) {
        cookie = cookies[i];
        String foundCookie = cookie.getName();
        //converts cookie name from string
        //to integer 
        int cookieNo = Integer.parseInt(foundCookie);

        if(cookieNo == enteredConfirmNo) {
            confirmNumber = cookieNo;
            shippingDate = cookie.getValue();
        }
    }

    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

    try {
        date = formatter.parse(shippingDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    //converts shippingDate from string
    //to calendar format
    Calendar shipDate = Calendar.getInstance();
    shipDate.setTime(date);

    //gets today's date in calendar format
    Calendar today = Calendar.getInstance();

    //unsure if this will throw int or string
    long daysTillShip = getDateDiffInDays(today.getTime(), shipDate.getTime());

    if(confirmNumber != 0 &&
        daysTillShip > 5) {
            showPage(response, "Your order was successfully canceled.");

    }  else {
        showPage(response, "Either it is less than 5 days before delivery " + 
                            "or your confirmation number does not exist");
    }
} 

/**
 * Actually shows the <code>HTML</code> result page
 */
protected void showPage(HttpServletResponse response, String message)
throws ServletException, java.io.IOException {
    response.setContentType("text/html");
    java.io.PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Status of Your Order</title>");  
    out.println("</head>");
    out.println("<body>");
    out.println("<h2>" + message + "</h2>");
    out.println("</body>");
    out.println("</html>");
    out.close();

}

/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
    processRequest(request, response);
} 

/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
    processRequest(request, response);
}
}
编辑:正如其他人所问,日志文件是这样说的:

May 03, 2014 12:20:02 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [cancelOrder] in context with path [/csj] threw exception
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at cancelOrder.processRequest(cancelOrder.java:37)
    at cancelOrder.doPost(cancelOrder.java:118)
    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.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:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    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(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

May 03, 2014 12:20:45 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [cancelOrder] in context with path [/csj] threw exception
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at cancelOrder.processRequest(cancelOrder.java:37)
    at cancelOrder.doGet(cancelOrder.java:109)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    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.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:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

我发现,正如stacktrace所示,问题与int有关。我最终选择了一个稍微不同的方向,但我希望这是一个更干净的方向:

/*
 * cancelOrder servlet looks for the cookies associated
 * with the shopping cart confirmation page
 */

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.TimeUnit;

public class cancelOrder extends HttpServlet {

        //sets initial values for what we will retrieve
        //from the cookie
        String confirmNumber = "0";
        String shippingDate = "01/01/2000";
        Date date;

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */
    public static long getDateDiffInDays(Date date1, Date date2) {
        long diffInMillis = date2.getTime() - date1.getTime();
        return TimeUnit.MILLISECONDS.toDays(diffInMillis);
    }
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        //gets the fields that the user filled
        String enteredConfirmNumber = request.getParameter("ConfirmationNumber");


        //gets cookie value if it matches user input
        Cookie[] cookies = request.getCookies();
        Cookie cookie;
        for(int i=0; i<cookies.length; i++) {
            cookie = cookies[i];
            String foundCookie = cookie.getName();
            //converts cookie name from string
            //to integer 


            if(foundCookie.equals(enteredConfirmNumber)) {
                confirmNumber = foundCookie;
                shippingDate = cookie.getValue();
            }
        }

        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

        try {
            date = formatter.parse(shippingDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //converts shippingDate from string
        //to calendar format
        Calendar shipDate = Calendar.getInstance();
        shipDate.setTime(date);

        //gets today's date in calendar format
        Calendar today = Calendar.getInstance();

        //unsure if this will throw int or string
        long daysTillShip = getDateDiffInDays(today.getTime(), shipDate.getTime());

        if(confirmNumber.equals(enteredConfirmNumber) &&
            daysTillShip > 5) {
                showPage(response, "Your order was successfully canceled.");

        }  else {
            showPage(response, "Either it is less than 5 days before delivery " + 
                                "or your confirmation number does not exist");
        }
    } 

    /**
     * Actually shows the <code>HTML</code> result page
     */
    protected void showPage(HttpServletResponse response, String message)
    throws ServletException, java.io.IOException {
        response.setContentType("text/html");
        java.io.PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Status of Your Order</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h2>" + message + "</h2>");
        out.println("</body>");
        out.println("</html>");
        out.close();

    }

    /** Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    } 

    /** Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
}

服务器日志中有stacktrace吗?如果没有更多信息,很难说出任何事情。通常会有一个stacktrace显示异常发生的确切位置。我现在添加了日志文件信息,因此我希望这有助于确定问题所在!