J'ai vu cette ligne dans une méthode de classe et ma première réaction a été de ridiculiser le développeur qui l'a écrite. Mais ensuite, j'ai pensé que je devais m'assurer que j'avais raison en premier.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
Cette ligne sera-t-elle jamais évaluée comme fausse?
Réponses:
Non, ça ne peut pas. Si vous utilisez
this
, vous êtes dans l'instance etthis
n'est donc pas nul.Le JLS dit:
Si vous avez appelé une méthode à partir d'un objet, alors l'objet existe ou vous auriez un
NullPointerException
avant (ou c'est une méthode statique mais alors, vous ne pouvez pas l'utiliserthis
).Ressources :
this
mot - cléla source
this
méthode d'une instance pourrait être NULL. Je ne suis donc pas tout à fait convaincu que ce soit une raison suffisante en Java.foo.bar()
serait levée quandfoo
est découvertenull
. cela arrive avant d'entrer dans la méthode, mais la vraie histoire est qu'il n'y a pas de méthode à tenter d'appeler.this
mot - clé et qu'il se compile, il n'est pas nul lorsque vous l'observez. Mais comme d'autres le disent, cela n'empêche pas un NPE d'essayer d'appeler la méthode, par exemple, mais c'est complètement hors de votre contrôle en tant que méthode et une vérification nulle dans la méthode ne changera rien.C'est comme vous demander "Suis-je vivant?"
this
ne peut jamais être nulla source
this != null
soi. Ce n'est pas le cas - en C ++, par exemple,this
pourrait bien l'êtreNULL
, pour une méthode non virtuelle.Non jamais , le mot-clé 'this' lui-même représente l'instance (objet) active actuelle de cette classe dans la portée de cette classe, avec laquelle vous pouvez accéder à tous ses champs et membres (y compris les constructeurs) et à ceux visibles de sa classe parente.
Et, plus intéressant encore, essayez de le configurer:
Pensez-y? Comment est-ce possible, n'est-ce pas comme couper la branche sur laquelle vous êtes assis? Puisque le mot-clé «ceci» est disponible dans la portée de la classe donc dès que vous dites this = null; n'importe où dans la classe, vous demandez en gros à JVM de libérer la mémoire affectée à cet objet au milieu d'une opération que JVM ne peut tout simplement pas permettre car elle doit revenir en toute sécurité après avoir terminé cette opération.
De plus, toute tentative
this = null;
entraînera une erreur du compilateur. La raison est assez simple, un mot-clé en Java (ou dans n'importe quel langage) ne peut jamais recevoir de valeur, c'est-à-dire qu'un mot-clé ne peut jamais être la valeur de gauche d'une opération d'affectation.Autres exemples, vous ne pouvez pas dire:
la source
this = null
. Mon instance était dans Android où je voulais supprimer une vue et définir l'objet gérant la vue sur null. Ensuite, j'ai voulu utiliser une méthoderemove()
qui supprimerait la vue réelle et ensuite l'objet gestionnaire serait rendu inutile, donc j'ai voulu l'annuler.Si vous compilez avec
-target 1.3
ou une version antérieure, un externethis
peut êtrenull
. Ou du moins, c'était le cas ...la source
Outer.this.member
Non. Pour appeler une méthode d'une instance d'une classe, l'instance doit exister. L'instance est implicitement transmise en tant que paramètre à la méthode, référencée par
this
. Sithis
c'était le cas ,null
il n'y aurait pas eu d'instance pour appeler une méthode.la source
Il ne suffit pas que la langue l'applique. La VM doit l'appliquer. À moins que la machine virtuelle ne l'applique, vous pouvez écrire un compilateur qui n'applique pas la vérification de null avant d'appeler la méthode écrite en Java. Les opcodes pour un appel de méthode d'instance incluent le chargement de cette référence dans la pile, voir: http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787 . Substituer ceci à une référence nulle entraînerait en effet un test faux
la source
Dans les méthodes de classe statique,
this
n'est pas défini carthis
est associé à des instances et non à des classes. Je crois que cela donnerait une erreur du compilateur pour essayer d'utiliser unthis
mot-clé dans un contexte statique.la source
Une normale
this
ne peut jamais êtrenull
dans le vrai code Java 1 , et votre exemple utilise une normalethis
. Voir les autres réponses pour plus de détails.Un qualifié ne
this
devrait jamais l'êtrenull
, mais il est possible de briser cela. Considérer ce qui suit:Lorsque nous voulons créer une instance de
Inner
, nous devons le faire:La sortie est:
montrant que notre tentative de créer un
Inner
avec unenull
référence à sonOuter
a échoué.En fait, si vous vous en tenez à l'enveloppe "Pure Java", vous ne pouvez pas le casser.
Cependant, chaque
Inner
instance a unfinal
champ synthétique masqué (appelé"this$0"
) qui contient la référence auOuter
. Si vous êtes vraiment délicat, il est possible d'utiliser des moyens "non purs" pour attribuernull
au champ.Unsafe
pour le faire.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
soitnull
. 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.
la source
Lorsque vous appelez une méthode sur
null
référence, leNullPointerException
sera renvoyé à partir de Java VM. C'est par spécification, donc si votre machine virtuelle Java est strictement conforme à la spécification,this
cela ne le sera jamaisnull
.la source
Si la méthode est statique, il n'y en a pas
this
. Si la méthode est virtuelle, ellethis
ne peut pas être nulle, car pour appeler la méthode, le moteur d'exécution devra référencer la vtable à l'aide duthis
pointeur. Si la méthode n'est pas virtuelle alors, oui, il est possible qu'ellethis
soit nulle.C # et C ++ autorisent les méthodes non virtuelles, mais en Java, toutes les méthodes non statiques sont virtuelles et
this
ne seront donc jamais nulles.la source
tl; dr, "this" ne peut être appelé qu'à partir d'une méthode non statique et nous savons tous qu'une méthode non statique est appelée à partir d'une sorte d'objet qui ne peut pas être null.
la source