为什么toString()在一个Object实例(null)上没有抛出NPE?

时间:2015-04-08 11:36:42

标签: java nullpointerexception

考虑下面的一个:

Object nothingToHold = null;

System.out.println(nothingToHold);  //  Safely prints 'null'

在这里,Sysout必须期待String。 因此必须在实例上调用toString()。

那么为什么null.toString()工作真棒? Sysout会照顾这个吗?

编辑:其实我用StringBuilder的append()看到了这个奇怪的东西。所以尝试了Sysout。两者的行为方式相同。那个方法也在照顾吗?

4 个答案:

答案 0 :(得分:18)

PrintWriter' s println(Object)(这是您编写System.out.println(nothingToHold)时调用的方法)调用String.valueOf(x),如Javadoc中所述:

/**
 * Prints an Object and then terminates the line.  This method calls
 * at first String.valueOf(x) to get the printed object's string value,
 * then behaves as
 * though it invokes <code>{@link #print(String)}</code> and then
 * <code>{@link #println()}</code>.
 *
 * @param x  The <code>Object</code> to be printed.
 */
public void println(Object x)

String.valueOf(Object)将null转换为&#34; null&#34;:

/**
 * 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)

答案 1 :(得分:8)

PrintStream#println(Object s)方法调用PrintStream#print(String s)方法,首先检查参数是否为null,如果是,则将"null"设置为打印为简单的String

但是,传递给.print()方法的内容为"null" String,因为String.valueOf(String s)"null"方法之前返回.print()被调用。

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}

答案 2 :(得分:0)

以下是println()

的文档
  

打印一个字符串后跟换行符。该字符串将转换为   使用在构造过程中选择的编码的字节数组   这个流。然后将字节写入目标流   写(INT)。

     

如果发生I / O错误,则此流的错误状态将设置为true。

NULL可以转换为字节。

答案 3 :(得分:0)

    Object nothingToHold = null;
   System.out.println(nothingToHold != null ? nothingToHold : "null String or any thing else");

如果nothingToHold(Object)不等于null,这将显示输出,否则它将消息打印为“null String或其他任何东西”