Servlet java.lang.NumberFormatException

时间:2013-02-19 15:54:48

标签: java servlets

我在servlet上收到两个我需要作为字符串放置的参数,以便在PreparedStatement我可以使用setInt(1, parameter)

public class rate extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        PreparedStatement pstmt = null;
        Connection con = null;
       //FileItem f1;
        String id = request.getParameter("idbook");
        String opcoes = request.getParameter("voto");
        int idlivro=Integer.parseInt(id);
        int opcao = Integer.parseInt(opcoes);
        String updateString = "Update rating set livros_rate = ? where productId = ?";
        if (idlivro != 0)
     {

          try {
         //connect to DB 
         con = login.ConnectionManager.getConnection();
         pstmt = con.prepareStatement(updateString);
         pstmt.setInt(1, opcao);
         pstmt.setInt(2, idlivro);
         pstmt.executeUpdate();
      }
          catch (Exception e){
      }finally{
             try {
                 pstmt.close();
                 con.close();
             } catch (SQLException ex) {
                 Logger.getLogger(rate.class.getName()).log(Level.SEVERE, null, ex);
             }

          }
     }
}

但是,它会抛出以下异常:

java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at counter.rate.doPost(rate.java:45)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728

这是如何引起的?如何解决?

编辑:我会把发送参数的表单代码。

<div id="templatemo_content_right">
    <div class="templatemo_product_box">
            <h1><%=rs.getString(3)%>  <span>(<%=rs.getString(7)%>)</span></h1>
        <img src="<%=rs.getString(13)%>"/>
            <div class="product_info">
                <p><%=rs.getString(10)%></p>
                   <div><form action="rate"  method="POST">
                            <imput type="hidden" name="idbook" value="<%=rs.getString(1)%>"/>
                            <select name="voto">
                                <option value="0">Did not like</option>
                                <option value="1">Ok</option>
                                <option value="2" selected="selected">Liked</option>
                                <option value="3">Loved!</option>
                            </select>
                            <input type="submit" value="Votar!"/>
                    </form></div>

是导致问题的表格吗?

5 个答案:

答案 0 :(得分:4)

异常非常具有描述性,您尝试将null解析为int。在调用parseInt()

之前进行空检查
String id = request.getParameter("idbook");
    String opcoes = request.getParameter("voto");
int idlivro=0;    
if(id!=null)
   idlivro =Integer.parseInt(id);
    int opcao =0;
if(opcoes!=null)
 opcao=Integer.parseInt(opcoes);

<强> OneLiner:

int idlivro  = (id!=null) ? Integer.parseInt(id) : 0;

答案 1 :(得分:0)

int idlivro=Integer.parseInt(id);
int opcao = Integer.parseInt(opcoes);

可能是id或opcao为null或其中有空格。所以你得到java.lang.NumberFormatException。

可能的情况:

id ="";
id = "  123";
id=null;

答案 2 :(得分:0)

我怀疑你没有得到你期望的参数(如request.getParameter(“idbook”);是null)。

这是一个快速测试课程:

public class IntProb {

public static final String SOME_STRING = "888";
public static final String NULL_STRING = null;

public static void main(String[] argv) {

    System.out.println("-------- Testing parseInt ------------");

    System.out.println("converting SOME_STRING: ");
    try{
        int intSomeInt = Integer.parseInt(SOME_STRING);

    } catch(Exception e){
        e.printStackTrace();
    }

    System.out.println("converting NULL_STRING: ");
    try{
        int intSomeInt = Integer.parseInt(NULL_STRING);

    } catch(Exception e){
        e.printStackTrace();
    }

    System.out.println("-------- End of parseInt Test ------------");

}

}

$ javac IntProb.java $ java IntProb

yeilds:

-------- Testing parseInt ------------
converting SOME_STRING: 
converting NULL_STRING: 
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:417)
at java.lang.Integer.parseInt(Integer.java:499)
at IntProb.main(IntProb.java:20)
-------- End of parseInt Test ------------

尝试将null传递给parseInt非常糟糕。

答案 3 :(得分:0)

抛出NumberFormatException表示某个应用程序尝试将String转换为数字类型,但由于解析后的String格式不正确而失败。

在您的代码中,可能存在的违规行是:

int idlivro=Integer.parseInt(id);
int opcao = Integer.parseInt(opcoes);

这两个参数是直接从请求获得的:

String id = request.getParameter("idbook");
String opcoes = request.getParameter("voto");

请检查这些参数的格式(特别是检查它们是否为null"null"),如果您无法控制它们,请抓住NumberFormatException一个try-catch块:

//Code
try {
    //More Code
    int idlivro=Integer.parseInt(id);
    int opcao = Integer.parseInt(opcoes);
    //More Code
} catch(NumberFormatException nfe) {
    //Logic that should be executed if the book or the option are invalid.
}

当然,如果适合您,您也可以尝试捕获每个单独的解析。或者(如果你知道你没有获取任何null参数),你可以使用正则表达式来验证字符串,然后再尝试解析它(一种更干净的方法,恕我直言),如下所示:

String id = request.getParameter("idbook");
String opcoes = request.getParameter("voto");
//...
if(Pattern.matches("/^\d+$/", id)) {
    //Safe parse here.
}    

以您需要的方式构建代码,但在解析之前添加此检查可避免必须处理NUmberFormatException

答案 4 :(得分:0)

在表单的第8行,您遇到语法错误,可能会导致getRequest

出现问题

请参阅:&lt; imput type =&#34;隐藏&#34;名称=&#34; idbook&#34;值=&#34;&LT;%= rs.getString(1)%&GT;&#34; /&GT;

输入 != 输入