web-dev-qa-db-fra.com

Pourquoi toString () sur une instance d'objet (qui est null) ne lance pas NPE?

Considérez ci-dessous un:

Object nothingToHold = null;

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

Ici, Sysout doit attendre String. Donc, toString () doit être invoqué par exemple.

Alors pourquoi null.toString () fonctionne-t-il génial? Sysout s'en occupe-t-il?

EDIT: En fait, j'ai vu cette chose étrange avec append () de StringBuilder. Donc essayé avec Sysout. Les deux se comportent de la même manière. Alors, cette méthode prend-elle aussi soin de vous?

11
Snehal Masne

println(Object) de PrintWriter (qui est la méthode appelée lorsque vous écrivez System.out.println(nothingToHold)) appelle String.valueOf(x) comme expliqué dans la 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) convertit le null en "null":

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

La méthode PrintStream#println(Object s) appelle la méthode PrintStream#print(String s) , qui vérifie d'abord si l'argument est null et si c'est le cas, définit simplement "null" pour qu'il soit imprimé en tant que String brut.

Cependant, ce qui est passé à la méthode .print() est "null" sous la forme String, car la String.valueOf(String s) renvoie "null" avant la méthode .print() appelée.

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

Voici la documentation pour println()

Imprime une chaîne suivie d'une nouvelle ligne. La chaîne est convertie en un tableau d'octets en utilisant le codage choisi lors de la construction de ce flux. Les octets sont ensuite écrits dans le flux cible avec write (int).

Si une erreur d'E/S se produit, l'état d'erreur de ce flux est défini sur true.

NULL peut convertir en octets.

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

Cela affichera la sortie si NothingToHold (Object) n’est pas égal à null, sinon le message est imprimé sous la forme "NULL String ou toute autre chose"

0
raslan