Le problème est que la String.valueOf
méthode est surchargée :
Le langage de spécification Java exige que dans ce type de cas, la surcharge la plus spécifique soit choisie:
Si plusieurs méthodes membres sont à la fois accessibles et applicables à un appel de méthode, il est nécessaire d'en choisir une pour fournir le descripteur de la répartition de la méthode d'exécution. Le langage de programmation Java utilise la règle selon laquelle la méthode la plus spécifique est choisie.
Un char[]
est-un Object
, mais tout Object
n'est pas unchar[]
. Par conséquent, char[]
est plus spécifique que Object
, et comme spécifié par le langage Java, la String.valueOf(char[])
surcharge est choisie dans ce cas.
String.valueOf(char[])
s'attend à ce que le tableau soit non- null
, et comme null
est donné dans ce cas, il lance alors NullPointerException
.
Le "correctif" simple consiste à convertir le null
explicitement en Object
comme suit:
System.out.println(String.valueOf((Object) null));
// prints "null"
Questions connexes
Morale de l'histoire
Il y en a plusieurs importants:
- Efficace Java 2nd Edition, Item 41: Utilisez la surcharge judicieusement
- Ce n'est pas parce que vous pouvez surcharger que vous devriez à chaque fois
- Ils 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 qu'en effet , la
valueOf(char[])
surcharge est sélectionnée!
- Parfois, vous souhaitez lancer explicitement
null
(exemples à suivre)
Voir également
Au casting null
Il existe au moins deux situations dans lesquelles un cast explicite null
vers 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 à un paramètre vararg
Un exemple simple de ce dernier est le suivant:
static void vararg(Object... os) {
System.out.println(os.length);
}
Ensuite, nous pouvons avoir les éléments suivants:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Voir également
Questions connexes
null
dans ce cas), assurez-vous que les deux surcharges agissent de la même manière par rapport à cette valeur!