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为特定的引用类型:
nullvararg参数作为单个参数后者的一个简单示例如下:
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 次 |
| 最近记录: |