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?
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)
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);
}
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.
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"