Une normale thisne peut jamais être nulldans 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 Inneravec une nullréférence à son Outera échoué.
En fait, si vous vous en tenez à l'enveloppe "Pure Java", vous ne pouvez pas le casser.
Cependant, chaque Innerinstance a un finalchamp 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 nullau champ.
- Vous pourriez utiliser
Unsafepour 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.thisexpression sera évaluée à null2 .
Bref, il est possible qu'un qualifié thissoit 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.