我刚发现了一些有趣的东西。
public class test {
public static void main(String a[])
{
System.out.println(String.valueOf(null).length());
}
}
输出
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
这就是我所期待的。
但是当我运行这个
时public class test {
public static void main(String a[])
{
String s=null;
System.out.println(String.valueOf(s).length());
}
}
输出
4
有两个被重载的valueOf版本被调用,它们是
/**
* Returns the string representation of the <code>Object</code> argument.
*
* @param obj an <code>Object</code>.
* @return if the argument is <code>null</code>, then a string equal to
* <code>"null"</code>; otherwise, the value of
* <code>obj.toString()</code> is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
/**
* Returns the string representation of the <code>char</code> array
* argument. The contents of the character array are copied; subsequent
* modification of the character array does not affect the newly
* created string.
*
* @param data a <code>char</code> array.
* @return a newly allocated string representing the same sequence of
* characters contained in the character array argument.
*/
public static String valueOf(char data[]) {
return new String(data);
}
我没理解为什么valueOf(Object s)方法对null给予特殊处理。 想法/评论
答案 0 :(得分:3)
问题来自JLS的方法调用逻辑。
https://github.com/sayanee/angularjs-pdf/tree/master/example州,
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体的方法的规则。
现在,在您的第一种情况下,当您直接传递null
时,
System.out.println(String.valueOf(null).length());
String.valueOf(Object)
和String.valueOf(char[])
都适用...因此它使用最具体的方法,即char[]
。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。
但是在你的第二种情况下,你实际上传递的是String
,即使它是空的。
因此只有String.valueOf(Object)
适用。
答案 1 :(得分:2)
来自valueOf
docs
如果参数为null,则字符串等于&#34; null&#34 ;;否则,返回obj.toString()的值。