Ich habe diese Zeile in einer Klassenmethode gesehen und meine erste Reaktion war, den Entwickler, der sie geschrieben hat, lächerlich zu machen. Aber dann dachte ich mir, ich sollte sicherstellen, dass ich zuerst Recht hatte.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
Wird diese Zeile jemals als falsch bewertet?
Antworten:
Nein, das kann es nicht. Wenn Sie verwenden
this
, befinden Sie sich in der Instanz und sind daherthis
nicht null.Die JLS sagt:
Wenn Sie eine Methode von einem Objekt aus aufgerufen haben, ist das Objekt vorhanden oder Sie hätten eine
NullPointerException
vorherige (oder es ist eine statische Methode, die Sie jedoch nicht verwendenthis
können).Ressourcen:
this
Schlüsselwortquelle
this
einer Instanzmethode NULL sein. Ich bin also nicht ganz davon überzeugt, dass dies in Java ein ausreichender Grund ist.foo.bar()
ausgelöst, wennfoo
festgestellt wird, dass dies der Fall istnull
. Es passiert zwar vor der Eingabe der Methode, aber die wahre Geschichte ist, dass es keine Methode gibt, mit der versucht werden kann, sie aufzurufen.this
Schlüsselwort verwenden und es kompiliert, ist es nicht null, wenn Sie es beobachten. Aber wie andere sagen, verhindert dies nicht, dass eine NPE versucht, die Methode aufzurufen, z. B. Aber das liegt völlig außerhalb Ihrer Kontrolle als Methode, und eine Nullprüfung innerhalb der Methode wird nichts ändern.Es ist, als würde man sich fragen: "Bin ich am Leben?"
this
kann niemals null seinquelle
this != null
es selbstverständlich wäre. Dies ist beispielsweise in C ++ für eine nicht virtuelle Methode nicht derthis
FallNULL
.Nein, niemals , das Schlüsselwort 'this' selbst repräsentiert die aktuell lebende Instanz (Objekt) dieser Klasse im Bereich dieser Klasse, mit der Sie auf alle Felder und Mitglieder (einschließlich Konstruktoren) und die sichtbaren Felder der übergeordneten Klasse zugreifen können.
Und, was noch interessanter ist, versuchen Sie es einzustellen:
Denk darüber nach? Wie kann es möglich sein, wird es nicht so sein, als würde man den Ast abschneiden, auf dem man sitzt? Da das Schlüsselwort 'this' im Rahmen der Klasse verfügbar ist, sobald Sie dies sagen = null; Überall in der Klasse fordern Sie JVM auf, den diesem Objekt zugewiesenen Speicher während einer Operation freizugeben, die JVM einfach nicht zulassen kann, da sie nach Abschluss dieser Operation sicher zurückkehren muss.
Darüber hinaus führt ein Versuch
this = null;
zu einem Compilerfehler. Der Grund ist ziemlich einfach: Einem Schlüsselwort in Java (oder einer anderen Sprache) kann niemals ein Wert zugewiesen werden, dh ein Schlüsselwort kann niemals der linke Wert einer Zuweisungsoperation sein.Andere Beispiele kann man nicht sagen:
quelle
this = null
. Meine Instanz war in Android, wo ich eine Ansicht entfernen und das Objekt, das die Ansicht behandelt, auf null setzen wollte. Dann wollte ich eine Methode verwenden,remove()
die die eigentliche Ansicht entfernt und dann das Handler-Objekt unbrauchbar macht, also wollte ich es auf Null setzen.Wenn Sie mit
-target 1.3
oder früher kompilieren , kann ein äußeresthis
seinnull
. Oder zumindest früher ...quelle
Outer.this.member
Nein. Um eine Methode einer Instanz einer Klasse aufzurufen, muss die Instanz vorhanden sein. Die Instanz wird implizit als Parameter an die Methode übergeben, auf die verwiesen wird
this
. Wennthis
wurdenull
dann gäbe es keine Instanz gewesen , ein Verfahren zu nennen.quelle
Es reicht nicht aus, dass die Sprache dies erzwingt. Die VM muss dies erzwingen. Sofern die VM dies nicht erzwingt, können Sie einen Compiler schreiben, der die Nullprüfung nicht erzwingt, bevor Sie die in Java geschriebene Methode aufrufen. Zu den Opcodes für einen Aufruf einer Instanzmethode gehört das Laden dieser Referenz in den Stapel (siehe: http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787) . Das Ersetzen einer Nullreferenz würde tatsächlich dazu führen, dass der Test falsch ist
quelle
Wird in statischen Klassenmethoden
this
nicht definiert, dathis
Instanzen und keine Klassen zugeordnet sind. Ich glaube, es würde einen Compilerfehler geben, wenn versucht wird, dasthis
Schlüsselwort im statischen Kontext zu verwenden.quelle
Ein Normal
this
kann niemalsnull
in echtem Java-Code 1 enthalten sein , und in Ihrem Beispiel wird ein Normal verwendetthis
. Weitere Details finden Sie in den anderen Antworten.Ein Qualifizierter
this
sollte niemals seinnull
, aber es ist möglich, dies zu brechen. Folgendes berücksichtigen:Wenn wir eine Instanz von erstellen möchten
Inner
, müssen wir Folgendes tun:Die Ausgabe ist:
Dies zeigt, dass unser Versuch, ein
Inner
mit einemnull
Verweis darauf zu erstellen,Outer
fehlgeschlagen ist.In der Tat, wenn Sie innerhalb des Umschlags "Pure Java" bleiben, können Sie dies nicht brechen.
Jede
Inner
Instanz hat jedoch ein verstecktesfinal
synthetisches Feld (aufgerufen"this$0"
), das den Verweis auf das enthältOuter
. Wenn Sie wirklich knifflig sind, können Sienull
dem Feld "nicht reine" Mittel zuweisen .Unsafe
, um es zu tun.In beiden Fällen führt das Endergebnis dazu, dass der
Outer.this
Ausdrucknull
2 ergibt .Kurz gesagt, es ist möglich, dass ein Qualifizierter
this
istnull
. Es ist jedoch unmöglich, wenn Ihr Programm den "Pure Java" -Regeln folgt.1 - Ich rabattiere Tricks wie das "Schreiben" der Bytecodes von Hand und deren Weitergabe als echtes Java, das Optimieren von Bytecodes mit BCEL oder ähnlichem oder das Springen in nativen Code und das Durcheinander mit den gespeicherten Registern. IMO, das ist NICHT Java. Hypothetisch könnten solche Dinge auch als Ergebnis eines JVM-Fehlers passieren ... aber ich erinnere mich nicht an jeden Fehlerbericht.
2 - Tatsächlich sagt das JLS nicht, wie sich das Verhalten verhalten wird, und es könnte unter anderem von der Implementierung abhängen.
quelle
Wenn Sie eine
null
Referenzmethode aufrufen ,NullPointerException
wird diese von Java VM ausgelöst. Dies erfolgt nach Spezifikation. Wenn Ihre Java-VM die Spezifikation strikt einhält, istthis
dies niemals der Fallnull
.quelle
Wenn die Methode statisch ist, gibt es keine
this
. Wenn die Methode virtuell ist,this
kann sie nicht null sein, da die Laufzeit zum Aufrufen der Methode mithilfe desthis
Zeigers auf die vtable verweisen muss . Wenn die Methode nicht virtuell ist, ist es möglich, dass siethis
null ist.C # und C ++ erlauben nicht virtuelle Methoden, aber in Java sind alle nicht statischen Methoden virtuell und werden daher
this
niemals null sein.quelle
tl; dr, "this" kann nur von einer nicht statischen Methode aufgerufen werden, und wir alle wissen, dass eine nicht statische Methode von einer Art Objekt aufgerufen wird, das nicht null sein kann.
quelle