背景
这个问题与Why does String.valueOf(null) throw a NullPointerException?有关
考虑以下片段:
public class StringValueOfNull {
public static void main(String[] args) {
String.valueOf(null);
// programmer intention is to invoke valueOf(Object), but instead
// code invokes valueOf(char[]) and throws NullPointerException
}
}
正如链接问题的答案所解释的那样,Java的方法重载解决了对String.valueOf(char[])
的上述调用,这在运行时合法地导致了NullPointerException
。
在Eclipseandjavac 1.6.0_17
中编译,这是堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at StringValueOfNull.main(StringValueOfNull.java:3)
注意,上面的堆栈跟踪缺少键信息:它没有valueOf
方法的完全签名!上面写着String.valueOf(Unknown Source)
!
在我遇到的大多数情况下,异常堆栈跟踪总是拥有堆栈跟踪中实际存在的方法的完整签名,这当然非常有助于立即识别问题,并且首先提供堆栈跟踪(不用说,构建起来相当昂贵)的一个主要原因。
然而,在这种情况下,堆栈跟踪根本没有帮助。它在帮助程序员识别问题方面失败得很惨。
如前所述,我可以看到程序员可以用上述代码段识别问题的三种方法:
case
String valueOf(char[] data)
确实是唯一的。
最后一个选项可能是最不容易访问的,但当然是最终的答案(程序员可能误解了重载规则,IDE可能是错误的,但是字节码总是(?)说出正在做什么的真相)。
问题
发布于 2010-06-28 12:31:55
这通常与缺少调试信息有关。您可能正在使用JRE (而不是JDK),它不包括rt.jar类的调试信息。尝试使用完整的JDK,您将在堆栈跟踪中获得正确的位置:
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(String.java:177)
at java.lang.String.valueOf(String.java:2840)
at StringValueOfNull.main(StringValueOfNull.java:3)
发布于 2011-12-29 06:54:27
注意,如果您正在使用Ant构建,并且如果在javac命令中将debug属性设置为false,则可能会发生这种情况。
例:如果在Ant构建中需要在跟踪集debug =真正的中进行适当的定位,
<javac verbose="false" srcdir="${src}" destdir="${classdir}" debug="true" includes="**/*.java">
<classpath refid="compile.classpath" />
</javac>
发布于 2014-02-19 20:19:52
我也遇到了同样的问题,我使用spring和apache 进行持续集成。
我所犯的错误在build.xml文件中。
具有更精确内容的性别变化日志是:
带有错误的build.xml:
<javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes">
<classpath refid="compile.classpath" />
</javac>
build.xml无错误:
<javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes" debug="true">
<classpath refid="compile.classpath" />
</javac>
在结构中,我缺乏勇气,调试=“真”
https://stackoverflow.com/questions/3132302
复制相似问题