Das Rätsel der Null-String-Verkettung
In Java ist die Verkettung von Strings mit dem Operator „ “ eine häufige Operation. Wenn jedoch eine der Zeichenfolgen null ist, tritt unerwartetes Verhalten auf, das weitere Untersuchungen erfordert.
Widersprüchliche Erwartungen
Die herkömmliche Meinung würde nahelegen, dass die Verkettung einer Nullzeichenfolge die Folge sein sollte in einer NullPointerException. Schließlich wird null in Java oft als außergewöhnlicher Wert behandelt. In diesem Fall ist das Ergebnis jedoch keine Ausnahme, sondern eine Zeichenfolge, die „null“ enthält.
Betrachten Sie das folgende Beispiel:
String s = null; s = s + "hello"; System.out.println(s); // prints "nullhello"
Dieser Code gibt „nullhello“ aus, anstatt ein auszulösen NullPointerException, die unsere Erwartungen übertrifft.
Enthüllung der Mechanik
Um zu verstehen, warum dies geschieht, müssen wir uns mit der Java Language Specification (JLS) befassen. Wenn eines der Argumente in einer Zeichenfolgenverkettung laut JLS null ist, wird es automatisch in die Zeichenfolge „null“ konvertiert, bevor die Verkettung durchgeführt wird.
Implementierungsdetails
Um dieses Rätsel weiter zu lösen, können wir den vom Compiler generierten Bytecode für den obigen Code untersuchen. Der Compiler wandelt den Code tatsächlich in etwas Äquivalentes um:
String s = null; s = new StringBuilder(String.valueOf(s)).append("hello").toString(); System.out.println(s); // prints "nullhello"
Die StringBuilder-Klasse verarbeitet Nullwerte ordnungsgemäß, sodass die Verkettung ausnahmslos erfolgreich ist.
Compiler-Optimierung
Es ist erwähnenswert, dass das JLS dem Compiler ausdrücklich erlaubt, die Zeichenfolgenverkettung für die Leistung zu optimieren. In unserem Beispiel hätte der Compiler einen effizienteren Ansatz verwenden können, etwa die direkte Erstellung eines StringBuffer und die Vermeidung des Zwischenaufrufs String.valueOf().
Implikationen und Verwendung
Dieses Verhalten hat mehrere Auswirkungen für Java-Programmierer:
Das obige ist der detaillierte Inhalt vonWarum löst die Java-String-Verkettung mit Null keine NullPointerException aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!