This question already has answers here:
Why does String.valueOf(null) throw a NullPointerException?

(4 个回答)


5年前关闭。




我刚刚发现了一些有趣的东西。
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 给予特殊处理。
想法/评论?

最佳答案

问题出在JLS的方法调用逻辑上。

JLS's Choosing the Most Specific Method 说,



现在,在您的第一种情况下,当您直接传递 null 时,

System.out.println(String.valueOf(null).length());
String.valueOf(Object)String.valueOf(char[]) 都适用......所以它使用 最具体的方法 ,它是一个 char[]



但是在你的第二种情况下,你实际上传递了一个 String 即使它是空的。

所以只有 String.valueOf(Object) 是适用的。

关于java - 当我们传递一个空字符串时,String 的 valueOf 方法返回 4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32761535/

10-10 11:45