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!String.valueOf(Object)
etvalueOf(char[])
faire des choses complètement différentes de toute façon (indépendammentnull
ou non) que peut-être qu'ils n'auraient pas dû être des surcharges en premier lieu.return null;
serait exactement la même chose quereturn (Object) null;
?Le problème est que vous appelez
String.valueOf(char[])
et nonString.valueOf(Object)
.La raison en est que Java choisira toujours la version la plus spécifique d'une méthode surchargée qui fonctionne avec les paramètres fournis.
null
est une valeur valide pour unObject
paramètre, mais c'est aussi une valeur valide pour unchar[]
paramètre.Pour que Java utilise la
Object
version, passeznull
via une variable ou spécifiez un cast explicite en Object:la source
Un bogue, numéroté 4867608 a été déposé pour ce chemin en 2003, qui a été résolu comme "ne résoudra pas" avec cette explication.
la source
Utilisation
String.valueOf(null: Any)
dans Scala.la source