为什么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[])
重载!
- 使用Eclipse,可以将鼠标hover在上述expression式上,并确定已选中
- 有时候你想明确地将
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与提供的参数一起工作的重载方法的最特定版本。 null
是Object
参数的有效值,但是它也是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
。