【发布时间】:2014-05-23 21:27:49
【问题描述】:
我正在学习 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)
【问题讨论】:
-
服务器日志中有任何堆栈跟踪吗?
-
在没有更多信息的情况下很难说出任何事情。通常会有一个堆栈跟踪显示异常发生的确切位置。
-
我现在已经添加了日志文件信息,所以我希望这有助于确定问题所在!