Une normale this
ne peut jamais être null
dans le vrai code Java 1 , et votre exemple utilise une normale this
. Voir les autres réponses pour plus de détails.
Un qualifié ne this
devrait jamais l'être null
, mais il est possible de briser cela. Considérer ce qui suit:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Lorsque nous voulons créer une instance de Inner
, nous devons le faire:
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
}
La sortie est:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
montrant que notre tentative de créer un Inner
avec une null
référence à son Outer
a échoué.
En fait, si vous vous en tenez à l'enveloppe "Pure Java", vous ne pouvez pas le casser.
Cependant, chaque Inner
instance a un final
champ synthétique masqué (appelé "this$0"
) qui contient la référence au Outer
. Si vous êtes vraiment délicat, il est possible d'utiliser des moyens "non purs" pour attribuer null
au champ.
- Vous pourriez utiliser
Unsafe
pour le faire.
- Vous pouvez utiliser du code natif (par exemple JNI) pour le faire.
- Vous pouvez le faire en utilisant la réflexion.
Quoi qu'il en soit, le résultat final est que l' Outer.this
expression sera évaluée à null
2 .
Bref, il est possible qu'un qualifié this
soit null
. Mais c'est impossible si votre programme suit les règles "Pure Java".
1 - J'écarte des astuces telles que "écrire" les bytecodes à la main et les faire passer pour de vrais Java, peaufiner les bytecodes en utilisant BCEL ou similaire, ou sauter dans le code natif et faire des emplettes avec les registres sauvegardés. IMO, ce n'est PAS Java. Hypothétiquement, de telles choses peuvent également se produire à la suite d'un bogue JVM ... mais je ne me souviens pas de tous les rapports de bogues.
2 - En fait, le JLS ne dit pas quel sera le comportement, et cela pourrait dépendre de l'implémentation ... entre autres.