问题是String.valueOf
方法重载:
Java 规范语言要求在这些情况下,选择最具体的重载:
如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。
A char[]
is-an Object
,但并非所有Object
is-a char[]
。因此,char[]
比更具体Object
,并且按照 Java 语言的规定,String.valueOf(char[])
在这种情况下选择重载。
String.valueOf(char[])
期望数组是 non- null
,并且因为null
在这种情况下给出了,所以它会抛出NullPointerException
.
简单的“修复”是将null
显式转换Object
为如下:
System.out.println(String.valueOf((Object) null));
// prints "null"
相关问题
故事的道德启示
有几个重要的:
- Effective Java 第 2 版,第 41 条:明智地使用重载
- 仅仅因为你可以超载,并不意味着你每次都应该
- 它们可能会引起混乱(特别是如果方法做的事情完全不同)
- 使用好的IDE,你可以在编译时检查选择了哪个重载
- 使用 Eclipse,您可以将鼠标悬停在上面的表达式上,并看到确实选择了
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"
也可以看看
相关问题