Pourquoi getcontexteapplication() dans le constructeur de l'Activité throws exception de pointeur null?
Après un certain temps passé à la chasse au bug, il s'avère que :
public class MainActivity extends BaseActivity { //BaseActivity extends Activity
public MainActivity() {
super();
getApplicationContext(); //NPE here
}
}
Pourquoi ? Où cela est-il documenté ?
Froyo
Ne jamais mettre en œuvre un constructeur sur une activité.
C'était un
"C'était un service fait", le code que vous avez copié ci-dessus montre une activité mise en œuvre d'un constructeur. "De toute façon, ne devrait-ce pas/n'est-ce pas documenté quelque part ?" -- developer.android.com/reference/android/app/... "Appelée lorsque l'activité commence. C'est là que la plupart d'initialisation devrait aller: appel setContentView(int) pour gonfler l'activité de l'INTERFACE utilisateur, à l'aide de findViewById(int) de programmation pour interagir avec les widgets de l'INTERFACE utilisateur, appelant managedQuery() pour récupérer les curseurs pour les données en cours d'affichage, etc."
Nope, pas un problème. Toute méthode peut lever une exception NullPointerException, il n'a pas à être déclarée. Et, même SI elle a retourné null au lieu de lancer une exception NullPointerException, vous vous retrouvez jeter l'exception de vous-même plus tard, lorsque vous avez essayé d'utiliser la valeur null. Btw, en retournant une valeur null et en jetant un NPE sont conceptuellement différentes choses.
Je sais - et non, je pense que ce comportement est contre-intuitif. Une méthode n'est pas censé jeter un décoché exception, sauf A) si elle dispose d'un bug ou B), on utilise de manière erronée - mais ce mal doit être dans les docs - comme dans la plupart des classes de l'api java (jette NPE si l'argument est null, etc) - et j'ai l'habitude de vérifier la valeur null et je voudrais donc (probablement) pas tomber de nulle valeur de retour (je sais que c'est différent d'un NPE!)
C'était un
service
en fait 😀 le Soin de fournir certaines entrées - liens - liens. De toute façon, ne devrait-ce pas/n'est-ce pas documenté quelque part ?"C'était un service fait", le code que vous avez copié ci-dessus montre une activité mise en œuvre d'un constructeur. "De toute façon, ne devrait-ce pas/n'est-ce pas documenté quelque part ?" -- developer.android.com/reference/android/app/... "Appelée lorsque l'activité commence. C'est là que la plupart d'initialisation devrait aller: appel setContentView(int) pour gonfler l'activité de l'INTERFACE utilisateur, à l'aide de findViewById(int) de programmation pour interagir avec les widgets de l'INTERFACE utilisateur, appelant managedQuery() pour récupérer les curseurs pour les données en cours d'affichage, etc."
Nope, pas un problème. Toute méthode peut lever une exception NullPointerException, il n'a pas à être déclarée. Et, même SI elle a retourné null au lieu de lancer une exception NullPointerException, vous vous retrouvez jeter l'exception de vous-même plus tard, lorsque vous avez essayé d'utiliser la valeur null. Btw, en retournant une valeur null et en jetant un NPE sont conceptuellement différentes choses.
Je sais - et non, je pense que ce comportement est contre-intuitif. Une méthode n'est pas censé jeter un décoché exception, sauf A) si elle dispose d'un bug ou B), on utilise de manière erronée - mais ce mal doit être dans les docs - comme dans la plupart des classes de l'api java (jette NPE si l'argument est null, etc) - et j'ai l'habitude de vérifier la valeur null et je voudrais donc (probablement) pas tomber de nulle valeur de retour (je sais que c'est différent d'un NPE!)
OriginalL'auteur Mr_and_Mrs_D | 2013-04-14
Vous devez vous connecter pour publier un commentaire.
Attendre la fin de
onCreate
d'appeler cette méthode.getApplicationContext();
retourne null mais qu'il lance. Où est-ce documenté est ma question - et, éventuellement, un peu de théorie sur le sujet 🙂 - je crois que beaucoup ont tomba sur le manque de docs sur ce serait admissible, pour un rapport de bugVérifier le code source de l'Activité. Ma conjecture est que le contexte sera appelée et de générer les entrées en phase nationale.
Soins pour poster un lien vers le code ?
Lien : grepcode.com/file/repository.grepcode.com/java/ext/...
Vous avez mal compris le lien. C'est l'impl héritée par l'Activité.
OriginalL'auteur Snicolas
Juste pour avoir une idée de ce qu'il se passe. Activité s'étend ContextThemeWrapper qui s'étend ContextWrapper de qui Activité hérite
getApplicationContext()
. ContextWrapper la met en œuvre, comme :La seul constructeur public de
ContextWrapper
est :dans
ContextThemeWrapper
nous avons :et depuis Activité ne définit pas explicitement un constructeur le constructeur ci-dessus est appelé -
mBase == null
dans l'Activité de constructeur - boom.Liens à partir de
4.2.2_r1
OriginalL'auteur Mr_and_Mrs_D