我在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>
是导致问题的表格吗?
答案 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;
输入 != 输入