2010-02-03 29 views
10

tengo unas pocas seguimiento de la pila (parte de)¿Por qué esta NumberFormatException?

Servlet.service() for servlet action threw exception 
java.lang.NumberFormatException: For input string: "37648" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Long.parseLong(Long.java:403) 
at java.lang.Long.valueOf(Long.java:482) 
at java.lang.Long.decode(Long.java:593) 

en un archivo de registro de mi No sé lo que era cadena de entrada real. Pero el usuario había hecho pasar el mismo rastro de pila.

¿Cómo puede ocurrir tal stacktrace?

+1

Por favor, conviértanlo en una pregunta, de momento solo es una afirmación – daveb

Respuesta

29

Probablemente porque tienen un cero en su entrada.

Esto funciona muy bien:

public class DecodeLong 
{ 
    public static final void main(String[] params) 
    { 
     long l; 

     l = Long.decode("37648"); 
     System.out.println("l = " + l); 
    } 
} 

Pero si cambia esto:

l = Long.decode("37648"); 

a esto:

l = Long.decode("037648"); 

... se convierte en octal válido, y la excepción de Long.parseLongno incluye el cero inicial:

Exception in thread "main" java.lang.NumberFormatException: For input string: "37648" 
     at java.lang.NumberFormatException.forInputString(Unknown Source) 
     at java.lang.Long.parseLong(Unknown Source) 
     at java.lang.Long.valueOf(Unknown Source) 
     at java.lang.Long.decode(Unknown Source) 
     at DecodeLong.main(DecodeLong.java:24) 

No incluye porque decode llamadas parseLong sin el cero, pero con la base de puesta a 8.

Hablar de oscuro. :-) Por lo tanto, si actualiza su programa para manejar la excepción al mostrar la entrada real, probablemente encontrará algo similar a eso.

+4

¡Guau! Felicitaciones por encontrar eso! –

+0

Fue precisamente la respuesta que busqué –

+0

@Xavier: ¡Me alegro de que haya sido útil! –