首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(未知源)在异常堆栈跟踪中

(未知源)在异常堆栈跟踪中
EN

Stack Overflow用户
提问于 2010-06-28 12:24:24
回答 6查看 91.6K关注 0票数 55

背景

这个问题与Why does String.valueOf(null) throw a NullPointerException?有关

考虑以下片段:

代码语言:javascript
运行
复制
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中编译,这是堆栈跟踪:

代码语言:javascript
运行
复制
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

  • Programmer中的
  • 程序员自己意识到该方法已经重载,并且根据解析规则,在这个中调用“错误”重载可以让他/她快速查看在Eclipse中选择哪种方法的
    • ,例如,鼠标悬停在上面的表达式中快速告诉程序员String valueOf(char[] data)确实是唯一的。

  • 程序员检查字节码(ugh!)

最后一个选项可能是最不容易访问的,但当然是最终的答案(程序员可能误解了重载规则,IDE可能是错误的,但是字节码总是(?)说出正在做什么的真相)。

问题

  • 为什么在这种情况下堆栈跟踪对于堆栈跟踪中的方法的签名信息如此缺乏信息?
    • 是编译器造成的吗?运行时?某物else?

  • 在其他什么(罕见?)堆栈跟踪可能无法捕获这样的基本信息吗?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-28 12:31:55

这通常与缺少调试信息有关。您可能正在使用JRE (而不是JDK),它不包括rt.jar类的调试信息。尝试使用完整的JDK,您将在堆栈跟踪中获得正确的位置:

代码语言:javascript
运行
复制
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)
票数 30
EN

Stack Overflow用户

发布于 2011-12-29 06:54:27

注意,如果您正在使用Ant构建,并且如果在javac命令中将debug属性设置为false,则可能会发生这种情况。

例:如果在Ant构建中需要在跟踪集debug =真正的中进行适当的定位,

代码语言:javascript
运行
复制
    <javac verbose="false" srcdir="${src}" destdir="${classdir}" debug="true" includes="**/*.java">
        <classpath refid="compile.classpath" />
    </javac>
票数 109
EN

Stack Overflow用户

发布于 2014-02-19 20:19:52

我也遇到了同样的问题,我使用springapache 进行持续集成。

我所犯的错误在build.xml文件中。

具有更精确内容的性别变化日志是:

带有错误的build.xml:

代码语言:javascript
运行
复制
    <javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes">
        <classpath refid="compile.classpath" />
    </javac>

build.xml无错误:

代码语言:javascript
运行
复制
    <javac srcdir="${src.home}" destdir="${work.home}/WEB-INF/classes"  debug="true">
        <classpath refid="compile.classpath" />
    </javac>

在结构中,我缺乏勇气,调试=“真”

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3132302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档