代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

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

  •  49
  • polygenelubricants  · 技术社区  · 15 年前

    背景

    这个问题与 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 在运行时。

    javac 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) !

    在我遇到的大多数情况下,异常堆栈跟踪总是具有实际在堆栈跟踪中的方法的完整签名,这当然是错误的 在立即识别问题的过程中,首先是提供堆栈跟踪的一个主要原因(毋庸置疑,它的构造成本相当高)。

    然而,在本例中,堆栈跟踪 一点用都没有 . 它在帮助程序员识别问题方面失败得很惨。

    • 程序员自己意识到方法是重载的,根据解析规则,在这种情况下会调用“错误”的重载
    • 程序员使用一个好的IDE,使他/她能够快速看到选择了哪种方法
      • 例如,在Eclipse中,鼠标悬停在上面的表达式上会很快告诉程序员 String valueOf(char[] data) 确实是被选中的
    • 程序员检查字节码(啊!)

    最后一个选项可能是最难访问的,但当然是最终的答案(程序员可能误解了重载规则,IDE可能有缺陷,但字节码总是(?)告诉正在做的事情的真相)。


    问题

      • 这是因为编译器吗?运行时间?还有别的吗?
    • 在其他什么(罕见的?)场景中,堆栈跟踪不能捕获像这样的基本信息?
    6 回复  |  直到 8 年前
        1
  •  30
  •   unbeli    15 年前

    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)
    
        2
  •  106
  •   Supun Sameera    13 年前

    例:如果您需要在跟踪集中的适当位置 调试=真 在蚂蚁建造中,

        <javac verbose="false" srcdir="${src}" destdir="${classdir}" debug="true" includes="**/*.java">
            <classpath refid="compile.classpath" />
        </javac>
    
        3
  •  6
  •   jamlhet    11 年前

    春天 阿帕奇蚂蚁 持续集成。

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

    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>
    

    在这个结构中,我缺乏勇气

        4
  •  3
  •   bragboy    15 年前

    我在Eclipse中运行了代码,得到了以下结果,

    public class Aloof {
        public static void main(String[] args) {
            String.valueOf(null);
        }
    }
    
    Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.<init>(String.java:177)
        at java.lang.String.valueOf(String.java:2840)
        at mysql.Aloof.main(Aloof.java:19)
    

        5
  •  1
  •   Aaron Digulla    15 年前

    当源代码中没有调试(行)信息或者VM被告知在类加载时丢弃这些信息时,就会发生这种情况。因为您有一些行号,所以不是VM设置而是类 String 缺少调试信息。

        6
  •  1
  •   Peter Tseng    11 年前