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 die toString
Methode dieses Objekts aufgerufen .
Hinzufügen weiterer Details: Interne Druckmethoden rufen die String.valueOf(object)
Methode für das Eingabeobjekt auf. In der valueOf
Methode hilft diese Prüfung, eine Nullzeigerausnahme zu vermeiden:
return (obj == null) ? "null" : obj.toString();
Für den Rest Ihrer Verwirrung sollte das Aufrufen einer Methode für ein Nullobjekt eine Nullzeigerausnahme auslösen, wenn nicht sogar einen Sonderfall.
Sie können null
in einen beliebigen Referenztyp umwandeln. Sie können auch Methoden aufrufen, die a null
als Argument behandeln, z. B. System.out.println(Object)
, aber Sie können nicht auf einen null
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.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld()
trotzdem "optimiert" ? Ähnlich wie final 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.
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:
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
Andernfalls könnten Sie die benötigte Methode nicht aufrufen.
String bar = null;
wirft den null
Wert auf String
. 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
und s instanceof String
wird false
in diesen Fällen zurückkehren.
Viele Antworten hier erwähnen bereits
Sie können für jeden Referenztyp null umwandeln
und
Wenn das Argument null ist, ist eine Zeichenfolge gleich "null".
Ich habe mich gefragt, wo das angegeben ist, und in der Java-Spezifikation nachgeschlagen:
Wie andere geschrieben haben, können Sie für alles null setzen. Normalerweise würden Sie das nicht brauchen, Sie können schreiben:
String nullString = null;
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.
void foo(String bar) { ... }
void foo(Object bar) { ... }
dann würde es einen Unterschied machen, wenn Sie tippen
foo((String) null) vs. foo(null)
b) wenn Sie beabsichtigen, Ihre IDE zum Generieren von Code zu verwenden; Zum Beispiel schreibe ich normalerweise Unit-Tests wie:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
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.
Drucken :
Drucken Sie ein Objekt. Die von der String.valueOf (Object) -Methode erzeugte Zeichenfolge wird in Bytes übersetzt
ValueOf :
Wenn das Argument null ist, ist eine Zeichenfolge gleich "null". Andernfalls wird der Wert von obj.toString () zurückgegeben.
Es wird einfach eine Zeichenfolge mit dem Wert "null" zurückgegeben, wenn sich das Objekt befindet null
.
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:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
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
JDialog(null, String, boolean, Graphicsconfiguration)
ist mehrdeutig, daher kann ich in diesem Fall den Aufruf eingrenzen, indem ich null auf einen der unterstützten Typen umwandle:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Diese Sprachfunktion ist in dieser Situation praktisch.
public String getName() {
return (String) memberHashMap.get("Name");
}
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.