1

从传递电话号码的表单提交中获取 NumberFormat 异常。但是,传递的数字实际上是一个数字,我将其转换为 servlet 中的 int。在错误消息中,您可以看到在 - 8456640236 中输入了一个 int。

小服务程序方法

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
    Contact newComment = new Contact();

    newComment.setName(request.getParameter("nameParameter"));
    newComment.setEmail(request.getParameter("emailParameter"));
    newComment.setPhone(Integer.parseInt(request.getParameter("phoneParameter")));
    newComment.setComment(request.getParameter("commentParameter"));

    request.setAttribute("commentAttribute", newComment);

    RequestDispatcher view = request.getRequestDispatcher("/successComment.jsp");
    view.forward(request, response);
}

错误信息

java.lang.NumberFormatException: For input string: "8456640236"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
java.lang.Integer.parseInt(Integer.java:461)
java.lang.Integer.parseInt(Integer.java:499)
org.test.Servlet.doPost(Servlet.java:21)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
4

4 回答 4

4

您尝试解析的值大于Integer可以容纳的值2 31 -1,即 2147483647。

您需要将其改为Long(or long) 并用于Long#parseLong()解析它。

newComment.setPhone(Long.parseLong(request.getParameter("phoneParameter")));

请注意,这个具体问题与 JSP/Servlets无关,而与基本 Java无关。在具有方法和硬编码值的普通 Java 类中这样做时,您会遇到完全相同的问题main()(这对您来说更容易隔离问题)。

于 2012-09-09T23:40:20.093 回答
1

8456640236 不能转换为 32 位整数,它的十六进制表示是 0x1 F80E 16EC

如果是电话号码,为什么不将其保留为字符串?是什么阻止用户将其输入为“+44 12 3456 7890”或“1800 DONT CALL ME”

于 2012-09-09T23:41:08.313 回答
0

8456640236 对于 32 位 int 来说太大了。尝试将其视为 long 而不是 int。

于 2012-09-09T23:40:43.553 回答
0

稍微轻松一点,我建议对电话号码使用 String 而不是 int/long。原因是,一些用户喜欢输入以“-”分隔的电话号码,而且如果将来您打算要求用户同时输入 ISD 代码和标准代码以及电话号码,您将不得不支持更长的数字,然后您可能最终处于数据类型的错误一侧。此外,当提示用户输入 ISD 代码时,用户往往会在其前面加上“+”。

虽然为此,您必须检查您的项目要求。

希望有帮助。

于 2012-09-10T04:48:18.570 回答