java.lang.NumberFormatException:null

时间:2013-03-28 10:27:45

标签: java html jsp jdbc

我创建了一个登录表单,其中包含每个字段的验证。当我点击提交按钮时,将调用validate()来验证所有字段,并在成功验证后,它将重定向到另一个jsp页面,其中所有细节都将插入到Oracle数据库中。

但是我得到“org.apache.jasper.JasperException:java.lang.NumberFormatException:null”异常。另外“服务器遇到内部错误(),导致无法完成此请求”错误。我希望你能帮助我。

以下是代码:

<html>
    <head>
    <script type="text/javascript">
    function validate()
    {

        if(document.frm.username.value=="")
        {
          alert("Please enter Username");
          document.frm.username.focus();
        }

        else if(document.frm.mobile.value=="")
         {       
            alert("Please Enter your contact number");
            document.frm.mobile.focus();
         } 

       else
       {
        window.location = "insert.jsp";
       }
     }
</script>
    </head>

    <body>
    <form name="frm">
    <table>
    <tr><td>User Name:</td><td><input type="text" name="username"></td></tr>
    <tr><td>Contact Number:</td><td><input type="text" name="mobile"></td></tr>
    <tr><td><input type="submit" value="Submit" onclick="validate()"></td><td></td></tr>
    </table>
    </form>
    </body>

insert.jsp:

  <body>
             <%@page import="java.sql.*"%>
             <%@page import="java.util.*"%>
    <%
    Connection con=null;
    int mobile=Integer.parseInt(request.getParameter("mobile"));
    String username=request.getParameter("username");
    try{
         Class.forName("oracle.jdbc.driver.OracleDriver");
        con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","manager");

    Statement st=con.createStatement();
    st.executeUpdate("insert into stud values("+mobile+",'"+username+"')");
    out.println("Data is successfully inserted!");

      }

     catch(Exception e)
    {
       System.out.print(e);
    }
    %>
        </body>

4 个答案:

答案 0 :(得分:1)

那么如果你的手机号码是空白会怎么样?

   int mobile=Integer.parseInt(request.getParameter("mobile"));

您要求Integer.parseInt()解析空字符串或空字符串,这会导致您的问题。

来自the doc

  

抛出:       NumberFormatException - 如果字符串不包含可解析的整数。

您需要检查是否已填充mobile并在未填写时处理该方案。

我不会使用Integer存储手机号码,顺便说一句。位数可能导致溢出和/或您可能希望维护结构(例如国家代码和数字)等。

答案 1 :(得分:1)

您正在重定向浏览器以在GET上执行insert.jsp,但您并未向该新网址提供请求参数。因此,您的JSP获取mobile请求参数,即null,然后尝试将其解析为整数,从而产生NumberFormatException

您可以做的是将请求参数附加到URL,如下所示:

window.location = "insert.jsp?mobile=" + document.frm.mobile.value + "&username=" + document.frm.username.value;

但是,在POST请求中提交这些值会更好,而不是GET。我认为您可以通过向action="insert.jsp"标记添加form属性,将onClick属性更改为onSubmit并删除

来实现这一目标
 else {
    window.location = "insert.jsp";
 }

因为这将允许浏览器恢复其正常的表单提交。如果您在关注空字段后将其与return false;语句结合使用,则会阻止浏览器提交表单。

答案 2 :(得分:0)

如果您使用parseInt(),则应该在某处捕获异常:

int mobile;
try {
  mobile = Integer.parseInt(request.getParameter("mobile"));
} catch (NumberFormatException e) {
  // do something
}

在您的情况下,request.getParameter("mobile")可能返回null。

编辑,如前所述 - 将电话号码存储为整数可能不是一个好主意。请改为Long

答案 3 :(得分:0)

首先,您的代码非常危险。你应该检查服务器端的null或空!使用PreparedStatement而不是Statement。

其次,代码window.location = "insert.jsp";将无法满足您的期望。 使用action =“insert.jsp”将数据发送到该页面。然后,在你的js函数中,如果它没有通过条件则返回false,否则返回true;

使用onSubmit =“return validate()”而不是onClick事件。