2013-02-19 2 views
0

Я получаю два параметра на сервлет, который мне нужно поставить как строку, так что в PreparedStatement я могу использовать setInt(1, parameter).Servlet java.lang.NumberFormatException

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> 

- форму, вызывающую проблему?

+2

Что наиболее вероятно происходит, так это то, что у вас нет параметра запроса, называемого 'idbook'. Когда вы пытаетесь его проанализировать, оно равно null и, следовательно, выбрасывает «NumberFormatException». –

+0

Пожалуйста, используйте отладчик, чтобы проверить, является ли какой-либо из аргументов 'null'. –

ответ

4

Исключение довольно наглядное, вы пытаетесь разобрать нуль как 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

Я часто обертываю 'Integer.parseInt ();' в 'try {...} catch (NumberFormatException e) {...}', потому что неправильная строка типа «moof» вызовет 'NumberFormatException'. Часто у меня есть значение по умолчанию или какое-то поведение, которое я хочу вызвать, если синтаксический анализ не выполняется. –

+0

@MichaelShopsin ** NFE ** - это исключенное исключение во время выполнения. вам действительно не нужно обертывать его вокруг try/catch .. :) – PermGenError

+0

Реальная проблема заключается не в обработке параметров значения «null», а в руководстве OP, почему параметры не отправляются на сервер. Кроме того, если один из этих параметров действительно «null», тогда OP должен вернуть сообщение об ошибке, а не использовать значение «0» (которое ничего не может вернуть) –

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

Может быть идентификатор или opcao равно нулю или имеет место в нем. Таким образом, вы получаете java.lang.NumberFormatException.

Возможные случаи:

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

Я подозреваю, что вы не получаете параметры, которые вы ожидаете (как в request.getParameter («idbook»), равна нулю).

Вот быстрый класс тест:

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 $ ява 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 ------------ 

Попытка передать нуль в ParseInt идет плохо.

+0

Не могли бы вы взглянуть на код формы, который я добавил в исходное сообщение? – HugoMonteiro

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"), или, если у вас нет контроля над ними, поймайте это с блоком 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.

Смежные вопросы