请考虑以下代码段:
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种方法:
String valueOf(char[] data)确实是选中的那个