Aktualisieren von Referenzen in einem Ausdruck mit einer verschachtelten Zuweisung

8

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?

    
Nathan Hughes 23.05.2014, 18:13
quelle

2 Antworten

8

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:

  1. a 's Referenz wird berechnet. Dies wird manchmal als "Binden des Methodenaufrufs" bezeichnet.
  2. a=null wird als Teil von Bewertungsargumenten ausgewertet. Es wirkt sich nicht auf Schritt 1 aus.
  3. Die Verfügbarkeit von equals(Object) ist geprüft.
  4. JVM interner Code findet den tatsächlichen Bytecode.
  5. Aufruf findet statt

Die Referenz von a wird eindeutig bestimmt, bevor a auf Null gesetzt wird, um eine NPE zu vermeiden.

    
hexafraction 23.05.2014, 18:20
quelle
2

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.

    
Jim Garrison 23.05.2014 18:21
quelle