Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Control de Excepciones

Hola buenos días. estoy haciendo un pequeño trabajo con servlet's.

Al compilar mi codigo me arroja una excepcion java.lang.NumberFormatException: For input string: "" , entiendo esto como una entrada de string que esta vacio.

Alguna sugerencia, porfavor.
Les dejo mi codigo:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

int cetofa = Integer.parseInt(request.getParameter("CTOF"));
int fatoce = Integer.parseInt(request.getParameter("FTOC"));

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

/* TODO output your page here. You may use following sample code. */
out.println("<html>");
out.println("<head>");
out.println("<title>Conversion de Unidades</title>");
out.println("</head>");
out.println("");
out.println("<tabla border='1'>");

out.println("<tbody>");
try{
if(request.getParameter("Unidades").equals("Celsius"))
{
out.println("<thead>"
+"<th>Celsius</th>"
+"<th>Fahrenheit</th>"
+"</thead>");
for(int temperaturac=-100;temperaturac>=-100&&temperaturac<=100;temperaturac+=cetofa)
{
double conversionc= ((-100+temperaturac)-32)/1.8;
out.println("
<tr>");
out.println("<td>"+temperaturac+"</td>");
out.println("<td>"+conversionc+"</td>");
out.println("</tr>");
}

}else
if(request.getParameter("Unidades").equals("Fahrenheit"))
{
out.println("<thead>"
+"<th>Fahrenheit</th>"
+"<th>Celsius</th>"
+"</thead>");

for(int temperaturaf=-300;temperaturaf>=-300&&temperaturaf<=300;temperaturaf+=fatoce)
{
double conversionf= (1.8*temperaturaf)+32;
out.println("<tr>");
out.println("<td>"+temperaturaf+"</td>");
out.println("<td>"+conversionf+"</td>");
out.println("</tr>");
}
}
out.println("/tbody>");
out.println("</tabla>");
out.println("
");
out.println("</html>");
} finally {
out.close();
}

mayo 8, 2013 | Registered Commenterindissa

Entiendo que la java.lang.NumberFormatException se lanza en ejecución cuando se usa el parseInt de las primeras linea. En tal caso existen al menos dos formas de atajar el problema, una proactiva y otra reactiva.
La forma proactiva es comprobar el que parámetro cumple con una expresión regular (regex) para enteros. Esta opción añade logica para todos los casos, sea entero o no, pero es practicamene imperceptible.
La opción reactiva sería envolver la captura de parámetro en un bloque try/catch. Esta opción no añade demora en el caso de que sea entero, pero si resulta que el parámetro no es entero, se lanza la excepción que, en este caso, sí produciría un retraso considerable, ya que es costoso el manejo de excepciones por parte de la maquina virtual.

Yo me decanto por la primera, ya que la excepciones deberían ser usadas para recoger situciones excepcionales no facilmente controlables por el programador, y no para controlar el flujo del programa.

Saludos.

/* Opcion proactiva */
boolean esEntero = request.getParameter("CTOF").matches("\\b\\d+\\b");
if (esEntero) {
/* Todo OK. Se hace el trabajo del servlet */
int cetofa = Integer.parseInt(request.getParameter("CTOF"));
/* etc.... */
} else {
/* Tratar el error. Informar al usuario o lanzar una excepción */
}

/* Opcion reactiva */
try {
int cetofa = Integer.parseInt(request.getParameter("CTOF"));
/* etc.... */

} catch (NumberFormatException numberFormatException) {
/* Tratar el error. Informar al usuario o lanzar una excepción */

}

mayo 10, 2013 | Unregistered Commenterececiel