Ein Normal this
kann niemals null
in echtem Java-Code 1 enthalten sein , und in Ihrem Beispiel wird ein Normal verwendet this
. Weitere Details finden Sie in den anderen Antworten.
Ein Qualifizierter this
sollte niemals sein null
, aber es ist möglich, dies zu brechen. Folgendes berücksichtigen:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Wenn wir eine Instanz von erstellen möchten Inner
, müssen wir Folgendes tun:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
Die Ausgabe ist:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
Dies zeigt, dass unser Versuch, ein Inner
mit einem null
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 verstecktes final
synthetisches Feld (aufgerufen "this$0"
), das den Verweis auf das enthält Outer
. Wenn Sie wirklich knifflig sind, können Sie null
dem Feld "nicht reine" Mittel zuweisen .
- Sie könnten es verwenden
Unsafe
, um es zu tun.
- Sie können dazu nativen Code (z. B. JNI) verwenden.
- Sie könnten es tun, indem Sie Reflexion verwenden.
In beiden Fällen führt das Endergebnis dazu, dass der Outer.this
Ausdruck null
2 ergibt .
Kurz gesagt, es ist möglich, dass ein Qualifizierter this
ist null
. 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.