为什么这个NumberFormatException?

Xav*_*lle 11 java

我有这个堆栈跟踪(部分)

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)
Run Code Online (Sandbox Code Playgroud)

在我的一个日志文件中我不知道什么是真正的输入字符串.但是用户已经发生了相同的堆栈跟踪.

这样的堆栈跟踪怎么会发生?

T.J*_*der 30

可能是因为他们的输入中有一个前导零.

运行正常:

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

        l = Long.decode("37648");
        System.out.println("l = " + l);
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果你改变了这个:

l = Long.decode("37648");
Run Code Online (Sandbox Code Playgroud)

对此:

l = Long.decode("037648");
Run Code Online (Sandbox Code Playgroud)

...它变为无效的八进制,并且异常Long.parseLong 不包括前导零:

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)
Run Code Online (Sandbox Code Playgroud)

它不包括它,因为没有零的decode调用parseLong,但基数设置为8.

谈论晦涩难懂.:-)因此,如果您通过显示实际输入来更新程序以处理异常,您可能会发现它是这样的.