相关疑难解决方法(0)

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

背景

这个问题与 为什么String.valueOf(null)抛出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
    }
}
Run Code Online (Sandbox Code Playgroud)

正如在链接问题的答案中所解释的那样,Java的方法重载将上面的调用解析为String.valueOf(char[]),这NullPointerException在运行时是正确的.

在Eclipse中编译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)
Run Code Online (Sandbox Code Playgroud)

需要注意的是堆栈跟踪上面缺少关键信息:它具备的完整签名valueOf法!它只是说String.valueOf(Unknown Source)!

在我遇到的大多数情况下,异常堆栈跟踪总是具有实际位于堆栈跟踪中的方法的完整签名,这当然对于立即识别问题非常有用,并且是堆栈跟踪的主要原因(不需要首先说是建造相当昂贵的.

然而,在这种情况下,堆栈跟踪根本没有帮助.它在帮助程序员识别问题方面失败了.

按原样,我可以看到程序员可以使用以上代码段识别问题的3种方法:

  • 程序员自己意识到方法是重载的,并且通过解析规则,在这种情况下调用"错误的"重载
  • 程序员使用一个好的IDE,允许他/她快速查看选择的方法
    • 例如,在Eclipse中,鼠标悬停在上面的表达式上会很快告诉程序员String valueOf(char[] data)确实是选中的那个
  • 程序员检查字节码(呃!) …

java exception stack-trace

51
推荐指数
3
解决办法
8万
查看次数

标签 统计

exception ×1

java ×1

stack-trace ×1