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

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

如果参数为null ,那么一个string等于"null" ; 否则,返回obj.toString()的值。

但是,当我尝试这样做时,

 System.out.println("String.valueOf(null) = " + String.valueOf(null)); 

它会抛出NPE呢? (如果你不信,就自己试试!)

    线程“main”java.lang.NullPointerException中的exception
    在java.lang.String。(Unknown Source)
    在java.lang.String.valueOf(未知来源)

这是怎么发生的? 文件是在骗我吗? 这是Java中的一个主要错误吗?

问题是String.valueOf方法被重载

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

Java规范语言要求在这种情况下,select最具体的过载

JLS 15.12.2.5select最具体的方法

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

char[] 是一个 Object ,但不是所有的Object 都是一个 char[] 。 因此, char[]Object 更具体 ,并且由Java语言指定,在这种情况下selectString.valueOf(char[])重载。

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

简单的“修复”是将null明确地转换为Object ,如下所示:

 System.out.println(String.valueOf((Object) null)); // prints "null" 

相关问题

  • 多形性歧义区分是如何工作的?
  • 哪些重载将在Java中被选为null?

故事的道德启示

有几个重要的:

  • 有效的Java第2版,第41项:明智地使用重载
    • 只因为你可以超负荷,并不意味着你应该每一次
    • 他们可能会造成混乱(特别是如果方法做了大不相同的事情)
  • 使用良好的IDE,您可以检查在编译时select哪个过载
    • 使用Eclipse,可以将鼠标hover在上述expression式上,并确定已选中valueOf(char[])重载!
  • 有时候你想明确地将null (后面的例子)

也可以看看

  • 多态vs覆盖vs重载
  • 方法重载。 你能过度使用吗?

在铸造null

至less有两种情况需要将null明确地转换为特定的引用types:

  • 要select重载(如上例所示)
  • null作为参数vararg的单个参数

后者的一个简单例子如下:

 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" 

也可以看看

  • Java语言指南/variables – 了解它是如何实现的

相关问题

  • 为什么null投射?
  • forms参数types声明中double …和double []之间的区别

问题是你调用String.valueOf(char[])不是 String.valueOf(Object)

原因是Java总是select与提供的参数一起工作的重载方法的最特定版本。 nullObject参数的有效值,但是它也是char[]参数的有效值。

为了让Java使用Object版本,可以通过一个variables传递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)); 

一个编号为4867608的错误是在2003年提出的,这个解释是“不会修复”的。

由于兼容性的限制,我们无法改变这一点。 请注意,它是公共静态stringvalueOf(char data [])方法,它最终被调用,并没有提及空参数replace“null”。

@ ###。### 2003-05-23

如果您查看String.valueOf()方法的javadoc,您将看到它实际上指出了如果您通过NullPointerException传递一个空值到方法中。 另外,如果您的IDE将执行此操作,您可以查看这些方法的源代码,您将看到有一些特定的代码可能会将input为空,并引发NullPointerException