Das Problem ist, dass die String.valueOf
Methode überladen ist :
Die Java Specification Language schreibt vor, dass in solchen Fällen die spezifischste Überlastung ausgewählt wird:
Wenn auf mehr als eine Mitgliedsmethode zugegriffen werden kann und auf einen Methodenaufruf anwendbar ist, muss eine ausgewählt werden, um den Deskriptor für den Versand der Laufzeitmethode bereitzustellen. Die Programmiersprache Java verwendet die Regel, dass die spezifischste Methode ausgewählt wird.
A char[]
ist-ein Object
, aber nicht alles Object
ist-a char[]
. Daher char[]
ist die Überladung in diesem Fall spezifischer als Object
und wie in der Java-Sprache angegeben String.valueOf(char[])
.
String.valueOf(char[])
erwartet, dass das Array nicht ist null
, und da null
es in diesem Fall angegeben ist, wird es dann geworfen NullPointerException
.
Die einfache "Lösung" besteht darin, das null
explizit Object
wie folgt umzuwandeln:
System.out.println(String.valueOf((Object) null));
// prints "null"
Verwandte Fragen
Moral der Geschichte
Es gibt mehrere wichtige:
- Effektive Java 2nd Edition, Punkt 41: Verwenden Sie Überladung mit Bedacht
- Nur weil Sie überladen können, heißt das nicht, dass Sie es jedes Mal tun sollten
- Sie können Verwirrung stiften (insbesondere wenn die Methoden völlig unterschiedliche Dinge tun)
- Mit einer guten IDE können Sie überprüfen, welche Überladung beim Kompilieren ausgewählt ist
- Mit Eclipse können Sie mit der Maus über den obigen Ausdruck fahren und sehen, dass tatsächlich die
valueOf(char[])
Überladung ausgewählt ist!
- Manchmal möchten Sie explizit besetzen
null
(Beispiele folgen)
Siehe auch
Beim Casting null
Es gibt mindestens zwei Situationen, in denen eine explizite Umwandlung null
in einen bestimmten Referenztyp erforderlich ist:
- Überladung auswählen (wie im obigen Beispiel angegeben)
- Zu geben
null
als ein einziges Argument an einen Vararg Parameter
Ein einfaches Beispiel für Letzteres ist das Folgende:
static void vararg(Object... os) {
System.out.println(os.length);
}
Dann können wir folgendes haben:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Siehe auch
Verwandte Fragen
null
in diesem Fall), stellen Sie sicher, dass beide Überladungen in Bezug auf diesen Wert gleich sind!