String x = (String) null;
Warum gibt es in dieser Aussage keine Ausnahme?
String x = null;
System.out.println(x);
Es wird gedruckt null
. Die .toString()
Methode sollte jedoch eine Nullzeigerausnahme auslösen.
String x = (String) null;
Warum gibt es in dieser Aussage keine Ausnahme?
String x = null;
System.out.println(x);
Es wird gedruckt null
. Die .toString()
Methode sollte jedoch eine Nullzeigerausnahme auslösen.
Antworten:
Sie können
null
ohne Ausnahme in einen beliebigen Referenztyp umwandeln.Die
println
Methode löst keinen Nullzeiger aus, da zunächst geprüft wird, ob das Objekt null ist oder nicht. Wenn null, wird einfach die Zeichenfolge gedruckt"null"
. Andernfalls wird dietoString
Methode dieses Objekts aufgerufen .Hinzufügen weiterer Details: Interne Druckmethoden rufen die
String.valueOf(object)
Methode für das Eingabeobjekt auf. In dervalueOf
Methode hilft diese Prüfung, eine Nullzeigerausnahme zu vermeiden:Für den Rest Ihrer Verwirrung sollte das Aufrufen einer Methode für ein Nullobjekt eine Nullzeigerausnahme auslösen, wenn nicht sogar einen Sonderfall.
quelle
Sie können
null
in einen beliebigen Referenztyp umwandeln. Sie können auch Methoden aufrufen, die anull
als Argument behandeln, z. B.System.out.println(Object)
, aber Sie können nicht auf einennull
Wert verweisen und eine Methode darauf aufrufen.Übrigens Es gibt eine schwierige Situation, in der Sie statische Methoden für
null
Werte aufrufen können.quelle
t.yield() -> Thread.yeld()
trotzdem "optimiert" ? Ähnlich wiefinal int i = 1; while (i == 1)
optimiert aufwhile(true)
Dies ist beabsichtigt. Sie können
null
in einen beliebigen Referenztyp umwandeln. Andernfalls könnten Sie es nicht Referenzvariablen zuweisen.quelle
Das Umwandeln von Nullwerten ist erforderlich für das folgende Konstrukt, bei dem eine Methode überladen ist. Wenn Null an diese überladenen Methoden übergeben wird, weiß der Compiler nicht, wie die Mehrdeutigkeit behoben werden kann. Daher müssen wir in diesen Fällen Null typisieren:
Andernfalls könnten Sie die benötigte Methode nicht aufrufen.
quelle
String bar = null;
wirft dennull
Wert aufString
. Bisher musste ich in einem Test, in dem eine Methode überladen war, nur explizit null umsetzen, und ich wollte ihr Verhalten mit null Eingaben testen. Gut zu wissen, dass ich gerade eine ähnliche Antwort schreiben wollte, bevor ich Ihre fand.l instanceof Long
unds instanceof String
wirdfalse
in diesen Fällen zurückkehren.Println(Object)
VerwendetString.valueOf()
Print(String)
führt eine Nullprüfung durch.quelle
Viele Antworten hier erwähnen bereits
und
Ich habe mich gefragt, wo das angegeben ist, und in der Java-Spezifikation nachgeschlagen:
Die Nullreferenz kann jederzeit einem beliebigen Referenztyp zugewiesen oder umgewandelt werden (§5.2, §5.3, §5.5).
Wenn die Referenz null ist, wird sie in die Zeichenfolge "null" konvertiert (vier ASCII-Zeichen n, u, l, l).
quelle
Wie andere geschrieben haben, können Sie für alles null setzen. Normalerweise würden Sie das nicht brauchen, Sie können schreiben:
ohne die Besetzung dort zu setzen.
Aber es gibt Fälle, in denen solche Darsteller Sinn machen:
a) Wenn Sie sicherstellen möchten, dass eine bestimmte Methode aufgerufen wird, wie z.
dann würde es einen Unterschied machen, wenn Sie tippen
b) wenn Sie beabsichtigen, Ihre IDE zum Generieren von Code zu verwenden; Zum Beispiel schreibe ich normalerweise Unit-Tests wie:
Ich mache TDD; Dies bedeutet, dass die Klasse "MyClassUnderTest" wahrscheinlich noch nicht existiert. Durch Aufschreiben dieses Codes kann ich dann mit meiner IDE zuerst die neue Klasse generieren. und um dann einen Konstruktor zu generieren, der ein "Whatever" -Argument "out of the box" akzeptiert - die IDE kann aus meinem Test herausfinden, dass der Konstruktor genau ein Argument vom Typ Whatever verwenden sollte.
quelle
Drucken :
ValueOf :
Es wird einfach eine Zeichenfolge mit dem Wert "null" zurückgegeben, wenn sich das Objekt befindet
null
.quelle
Dies ist sehr praktisch, wenn Sie eine Methode verwenden, die ansonsten nicht eindeutig wäre. Beispiel: JDialog verfügt über Konstruktoren mit den folgenden Signaturen:
Ich muss diesen Konstruktor verwenden, da ich die GraphicsConfiguration festlegen möchte, aber kein übergeordnetes Element für diesen Dialog habe. Daher sollte das erste Argument null sein. Verwenden von
ist mehrdeutig, daher kann ich in diesem Fall den Aufruf eingrenzen, indem ich null auf einen der unterstützten Typen umwandle:
quelle
Diese Sprachfunktion ist in dieser Situation praktisch.
Wenn memberHashMap.get ("Name") null zurückgibt, soll die obige Methode dennoch null zurückgeben, ohne eine Ausnahme auszulösen. Egal was die Klasse ist, null ist null.
quelle