为什么String.valueOf(null)导致空指针异常?

Suj*_*ith 9 java

为什么String.valueOf(null)导致空指针异常?其中预期的行为是返回"null"字符串.

String x = null;
    System.out.println(String.valueOf(x));
Run Code Online (Sandbox Code Playgroud)

这给出了一个"null"字符串.但

System.out.println(String.valueOf(null));
Run Code Online (Sandbox Code Playgroud)

将导致空指针异常.

Boz*_*zho 18

因为String.valueOf(null)char[]参数选择重载方法,然后在new String(null)构造函数中失败.此选择在编译时进行.

如果要使用Object参数显式使用重载方法,请使用:

String.valueOf((Object) null)
Run Code Online (Sandbox Code Playgroud)

请注意,没有重载方法接受String参数 - 在第一种情况下调用的方法是Object.

引用JLS:

15.12.2编译时步骤2:确定方法签名

第二步搜索上一步中为成员方法确定的类型.此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法,即可以在给定参数上正确调用的声明.可能存在多于一种这样的方法,在这种情况下,选择最具体的方法.最具体方法的描述符(签名加返回类型)是在运行时用于执行方法分派的方法.

所有方法都适用,所以我们去:

15.12.2.5选择最具体的方法

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.

感谢polygenelubricants - 只有两个重载方法接受一个对象 - char[]并且Object- char[]是最具体的.

  • @Sujith:因为`char []`*是*一个对象 (3认同)
  • 没有误解.2个重载是`valueOf(Object)`和`valueOf(char [])`.没有`valueOf(String)`这样的东西.`char []`比`Object`更具体.另请参阅http://stackoverflow.com/questions/3131865/why-does-string-valueofnull-throw-a-nullpointerexception (2认同)
  • @polygenelubricants非常感谢.我忽略了没有`String`重载方法的事实.因此一切都落到了位置. (2认同)