Débutants. Aujourd'hui, j'ai écrit un code pour passer d'une activité à l'autre, en utilisant une intention explicite, mais j'ai défini une variable membre d'intention dans la classe, et lorsque je l'ai utilisée dans la méthode, le programme s'est écrasé. Pourquoi ?
public class MusicPlay extends Activity{
//下面这一句初始化出了错误
public Intent intent=intent=new Intent(this,MusicServer.class);
....
Le code est comme ci-dessus, mais le message d'erreur est :
Causé par : java.lang.NullPointerException : tentative d'invocation de la méthode virtuelle 'java.lang.String android.content.Context.getPackageName()' sur une référence d'objet nulle
On dit qu'une erreur s'est produite lors de l'appel de la méthode virtuelle getPackageName() sur une "référence d'objet nulle".
Au début, je pensais que c'était vide et que c'était la cause du problème, j'ai donc modifié le code :
public class MusicPlay extends Activity{
Intent intent;
public MusicPlay(){
super();
if(this!=null){
intent=new Intent(this,MusicServer.class);
}
}
....
Mais l'erreur persiste et le message d'erreur est toujours le même. Grâce à un jugement conditionnel, je sais que ce n'est pas vide, alors pourquoi est-il encore considéré comme une référence nulle ?
Activity
是ContextWrapper
的子类, 所以我们先找到并打开ContextWrapper.java
源码, 关键代码如下:ContextWrapper
里基于Context
的调用都是直接使用mBase
来间接实现调用的. 那么这个mBase
是什么时候被赋值的呢? 找到并打开ActivityThread.java
, 就能找到它被赋值的代码部分, 关键代码如下:以上, 可知: 实例化
Activity
时,ContextWrapper#getBaseContext()
返回的是null, 因此, 不能在构造函数或者构造成员变量时直接调用与Context
.Activity
est une sous-classe deContextWrapper
, nous trouvons donc et ouvrons d'abord le code source deContextWrapper.java
Le code clé est le suivant : 🎜 rrreee 🎜Les appelsContextWrapper
basés surContext
utilisent directementmBase
pour implémenter l'appel indirectement. Ensuite, cemBase
est quand. attribué ? Recherchez et ouvrezActivityThread.java
, et vous pourrez trouver la partie du code où il a été attribué. Le code clé est le suivant : 🎜 rrreee 🎜D'après ce qui précède, on peut voir que : lors de l'instanciation deActivity
,ContextWrapper#getBaseContext()
renvoie null Par conséquent, il ne peut pas être appelé directement dans le constructeur ou lors de la construction. variables membres avecInstanciation de toutes les fonctions et classes liées au Contexte
Si nécessaire, appelez-le dans sa fonction de cycle de vie.🎜.Votre classe hérite de la classe Activity, elle a donc un cycle de vie, et toute la logique est exécutée dans ces cycles de vie. En d'autres termes, votre code logique doit être écrit dans les méthodes de ces cycles de vie. méthode onCreate et écrivez des sauts de page là-bas. Le nom de l'identifiant de votre méthode n'est pas non plus standardisé
.Vous devez remplacer la méthode onCreate()