我有这个堆栈跟踪(部分)
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)
在我的一个日志文件中 我不知道什么是真正的输入字符串。 但是用户已经发生了相同的堆栈跟踪。
这样的堆栈跟踪怎么会发生?
答案 0 :(得分:30)
可能是因为他们的输入中有一个前导零。
运行良好:
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。
谈论晦涩难懂。 :-)因此,如果您通过显示实际输入来更新程序以处理异常,那么您可能会发现它就是这样的。