代码之家  ›  专栏  ›  技术社区  ›  Xavier Combelle

为什么此数字格式异常?

  •  11
  • Xavier Combelle  · 技术社区  · 15 年前

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

    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)
    

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

    这样的stacktrace怎么会发生?

    1 回复  |  直到 9 年前
        1
  •  30
  •   T.J. Crowder    15 年前

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

    这运行良好:

    public class DecodeLong
    {
        public static final void main(String[] params)
        {
            long    l;
    
            l = Long.decode("37648");
            System.out.println("l = " + l);
        }
    }
    

    但是如果你改变这个:

    l = Long.decode("37648");
    

    对此:

    l = Long.decode("037648");
    

    …它变为无效的八进制,异常来自 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)
    

    不包括它,因为 decode 电话 parseLong 没有零,但基数设置为8。

    谈论隐晦。:-)因此,如果通过显示 实际的 输入,你可能会发现它是沿着这些线的东西。