Das Problem ist, dass die String.valueOfMethode ü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 Objectund wie in der Java-Sprache angegeben String.valueOf(char[]).
String.valueOf(char[])erwartet, dass das Array nicht ist null, und da nulles in diesem Fall angegeben ist, wird es dann geworfen NullPointerException.
Die einfache "Lösung" besteht darin, das nullexplizit Objectwie 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 nullin einen bestimmten Referenztyp erforderlich ist:
- Überladung auswählen (wie im obigen Beispiel angegeben)
- Zu geben
nullals 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
nullin diesem Fall), stellen Sie sicher, dass beide Überladungen in Bezug auf diesen Wert gleich sind!