use*_*886 122 java null api-design overloading nullpointerexception
根据文档,该方法String.valueOf(Object obj)
返回:
如果参数是
null
,那么一个字符串等于"null"
; 否则,obj.toString()
返回值.
但是当我尝试这样做时怎么样:
System.out.println("String.valueOf(null) = " + String.valueOf(null));
Run Code Online (Sandbox Code Playgroud)
它会引发NPE而不是?(如果你不相信,请亲自尝试!)
Exception in thread "main" java.lang.NullPointerException at java.lang.String.(Unknown Source) at java.lang.String.valueOf(Unknown Source)
怎么会发生这种情况?文档对我说谎吗?这是Java中的一个主要错误吗?
pol*_*nts 196
问题是该String.valueOf
方法是重载的:
Java Specification Language规定在这种情况下,选择最具体的重载:
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.
A char[]
是-a Object
,但不是全部Object
是-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"
Run Code Online (Sandbox Code Playgroud)
有几个重要的:
valueOf(char[])
选择了重载!null
(示例要遵循)null
至少有两种情况需要明确地转换null
为特定的引用类型:
null
vararg参数作为单个参数后者的一个简单示例如下:
static void vararg(Object... os) {
System.out.println(os.length);
}
Run Code Online (Sandbox Code Playgroud)
然后,我们可以有以下内容:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Run Code Online (Sandbox Code Playgroud)
Joa*_*uer 17
问题是你在打电话String.valueOf(char[])
而不是 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));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
69791 次 |
最近记录: |