根据文档,该方法String.valueOf(Object obj)返回:
String.valueOf(Object obj)
如果参数是null,则字符串等于"null"; 否则,obj.toString()返回的值。
null
"null"
obj.toString()
但是,当我尝试这样做时,怎么会这样:
System.out.println("String.valueOf(null) = " + String.valueOf(null));
它会抛出NPE吗?(如果你不相信,请自己尝试!)
Exception in thread "main" java.lang.NullPointerException at java.lang.String.(Unknown Source) at java.lang.String.valueOf(Unknown Source)
怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗?
问题是String.valueOf方法已重载:
String.valueOf
Java规范语言要求在这种情况下,选择最具体的重载:
JLS 15.12.2.5选择最具体的方法 如果可以访问多个成员方法并将其应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最特定方法的规则。
一个char[] 是- Object但不是全部Object 是-一个 char[]。因此,char[]它比特定于Object,并且按照Java语言的规定,String.valueOf(char[])在这种情况下选择重载。
char[]
Object
String.valueOf(char[])
String.valueOf(char[])期望数组为非数组null,并且由于null在这种情况下给出了数组,所以它抛出了NullPointerException。
NullPointerException
简单的“修复”是将null显式强制转换Object为以下形式:
Objec
System.out.println(String.valueOf((Object) null)); // prints "null"