Wenn Sie sich diesen Beispielcode anschauen, der dieser Frage ähnelt :
%Vor%Dies gibt false aus. Warum scheitert es nicht mit einer NullPointerException? Die Zuweisung muss verarbeitet werden, bevor die equals-Methode ausgeführt werden kann, aber irgendwie wirkt sich dies nicht auf die Referenz aus, die erst aufgerufen wird, nachdem die gesamte Zeile ausgewertet wurde.
Ich habe nicht gesehen, wo in der Java-Sprachspezifikation das beschrieben wird, habe ich es irgendwo vermisst?
Von JLS :
Zur Laufzeit benötigt der Methodenaufruf fünf Schritte. Zuerst kann eine Zielreferenz berechnet werden. Zweitens werden die Argumentausdrücke ausgewertet. Drittens wird die Zugreifbarkeit der aufzurufenden Methode überprüft. Viertens wird der tatsächliche Code für die auszuführende Methode lokalisiert. Fünftens wird ein neuer Aktivierungsrahmen erstellt, die Synchronisierung wird bei Bedarf durchgeführt, und die Kontrolle wird an den Methodencode übergeben.
Dies zeigt das in a.equals((a = null))
. Die folgenden Schritte treten auf:
a
's Referenz wird berechnet. Dies wird manchmal als "Binden des Methodenaufrufs" bezeichnet. a=null
wird als Teil von Bewertungsargumenten ausgewertet. Es wirkt sich nicht auf Schritt 1 aus. equals(Object)
ist geprüft. Die Referenz von a
wird eindeutig bestimmt, bevor a
auf Null gesetzt wird, um eine NPE zu vermeiden.
Ich glaube, der Abschnitt der JLS, an dem Sie interessiert sind, ist
15.12.4. Laufzeitauswertung der Methodenaufruf
Zur Laufzeit benötigt der Methodenaufruf fünf Schritte. Zuerst kann eine Zielreferenz berechnet werden. Zweitens werden die Argumentausdrücke ausgewertet
Somit erfolgt die Bewertung des Ziels, während a
immer noch einen Nicht-Null-Wert hat, THEN a
wird auf null
als Argument für den Methodenaufruf gesetzt. Also wird die equals-Methode mit einem this
-Verweis auf das Objekt namens a
aufgerufen, das immer noch existiert, mit einem Null-Argument.
Tags und Links java variable-assignment expression-evaluation