String.valueOf(Object obj)
返回:
如果参数是
,那么字符串等于null
;否则,返回"null"
的值。obj.toString()
但是为什么当我尝试这样做时:
System.out.println("String.valueOf(null) = " + String.valueOf(null));
它会抛出 NPE 吗? (不信你自己试试!)
线程“main”中的异常 java.lang.NullPointerException 在 java.lang.String.(来源未知) 在 java.lang.String.valueOf(来源未知)
怎么会发生这种事?文档是在骗我吗?这是 Java 中的一个重大错误吗?
问题是
String.valueOf
方法是重载:
Java 规范语言要求在这些情况下,选择最具体的重载:
如果有多个成员方法既可访问又适用于方法调用,则需要选择一个来为运行时方法分派提供描述符。 Java 编程语言使用选择“最具体”方法的规则。
A
char[]
is-an
Object
,但不是全部 Object
is-a
char[]
。因此,char[]
比Object
更具体,并且根据Java语言的规定,在这种情况下选择String.valueOf(char[])
重载。String.valueOf(char[])
期望数组为非
null
,并且由于在这种情况下给出了 null
,因此它会抛出 NullPointerException
。简单的“修复”是将
null
显式转换为
Object
,如下所示:System.out.println(String.valueOf((Object) null));
// prints "null"
相关问题
valueOf(char[])
重载被选中!null
null
至少有两种情况需要将
null
显式转换为特定引用类型:
选择重载(如上例所示)
null
static void vararg(Object... os) {
System.out.println(os.length);
}
然后,我们可以得到以下内容:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
另请参阅
而不是
String.valueOf(Object)
。这样做的原因是 Java 将始终选择与所提供的参数一起使用的重载方法的最具体版本。
null
是
Object
参数的有效值,但它也是 char[]
参数的有效值。要使 Java 使用
Object
版本,可以通过变量传入
null
或指定显式转换为 Object:Object o = null;
System.out.println("String.valueOf(null) = " + String.valueOf(o));
// or
System.out.println("String.valueOf(null) = " + String.valueOf((Object) null));
String.valueOf(null: Any)
,否则推断
String.valueOf(null: Array[Char])
。同样,在 java 中,如果您对隐式转换不满意,则需要显式转换。在 IntelliJ 中,在使用 valueOf 时按 Ctrl+B 将使您在可以使用的众多 valueOf 版本中找到您使用的 valueOf 版本。