一尘不染

为什么String.valueOf(null)抛出NullPointerException?

java

根据文档,该方法String.valueOf(Object obj)返回:

如果参数是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中的主要错误吗?


阅读 406

收藏
2020-03-21

共1个答案

一尘不染

问题是String.valueOf方法已重载:

  • String.valueOf(Object)
  • String.valueOf(char[])

Java规范语言要求在这种情况下,选择最具体的重载:

JLS 15.12.2.5选择最具体的方法
如果可以访问多个成员方法并将其应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最特定方法的规则。

一个char[] 是- Object但不是全部Object 是-一个 char[]。因此,char[]它比特定于Object,并且按照Java语言的规定,String.valueOf(char[])在这种情况下选择重载。

String.valueOf(char[])期望数组为非数组null,并且由于null在这种情况下给出了数组,所以它抛出了NullPointerException

简单的“修复”是将null显式强制转换Object为以下形式:

System.out.println(String.valueOf((Object) null));
// prints "null"
2020-03-21