Le problème est que String.valueOf
La méthode est surchargé :
Le langage de spécification Java impose que dans ce type de cas, la surcharge la plus spécifique est choisi :
Si plusieurs méthodes membres sont à la fois accessibles et applicables à l'invocation d'une méthode, il est nécessaire d'en choisir une pour fournir le descripteur de l'envoi de la méthode d'exécution. Le langage de programmation Java utilise la règle selon laquelle la méthode le plus spécifique est choisie.
A char[]
est-un Object
mais pas tous Object
est un char[]
. Par conséquent, char[]
es plus spécifique que Object
et comme spécifié par le langage Java, l'élément String.valueOf(char[])
La surcharge est choisie dans ce cas.
String.valueOf(char[])
s'attend à ce que le tableau ne soit pas null
et puisque null
est donné dans ce cas, il lance alors NullPointerException
.
La "solution" facile est de lancer le null
Object
comme suit :
System.out.println(String.valueOf((Object) null));
// prints "null"
Questions connexes
Morale de l'histoire
Il y en a plusieurs qui sont importants :
-
Effective Java 2e édition, point 41 : utiliser judicieusement la surcharge.
- Ce n'est pas parce que vous pouvez surcharger, que vous devez le faire à chaque fois.
- Elles peuvent prêter à confusion (surtout si les méthodes font des choses très différentes).
- En utilisant un bon IDE, vous pouvez vérifier quelle surcharge est sélectionnée au moment de la compilation.
- Avec Eclipse, vous pouvez passer la souris sur l'expression ci-dessus et voir que en effet le
valueOf(char[])
la surcharge est sélectionnée !
- Parfois, vous voulez explicitement lancer
null
(exemples à suivre)
Voir aussi
Sur le casting null
Il y a au moins deux situations où le casting explicite null
à un type de référence spécifique est nécessaire :
- Pour sélectionner la surcharge (comme indiqué dans l'exemple ci-dessus)
- Pour donner
null
comme argument unique d'un paramètre vararg
Un exemple simple de ce dernier est le suivant :
static void vararg(Object... os) {
System.out.println(os.length);
}
Alors, nous pouvons avoir ce qui suit :
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Voir aussi
Questions connexes