2010-07-28 9 views
3

Le code suivant ne fonctionne pas, et lance une RuntimeException causée par NullPointerExceptionPourquoi ne pas ce travail - Android - onCreate()

public class ListFilteredActivity extends Activity { 
    LinearLayout typeSelector = new LinearLayout(this) ; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ScrollView sv = new ScrollView(this); 
     this.setContentView(sv); 
     //this.typeSelector = new LinearLayout(this); 
     this.typeSelector.setOrientation(LinearLayout.VERTICAL); 
     sv.addView(this.typeSelector); 
    } 

Lorsque je me suis déplacé l'initialisation de this.typeSelection à l'intérieur onCreate() il fonctionne très bien.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     this.typeSelector = new LinearLayout(this); 
     ... 
    } 

Pourquoi l'erreur du pointeur nul est-elle présente? La déclaration inline dans le premier morceau de code se produit dès que le constructeur est appelé, puis onCreate() a accès à l'objet, n'est-ce pas?

Répondre

3

LinearLayout nécessite que vous transmettiez un Context. Ceci est un objet de cycle de vie Android et non un objet Java. Lors de la déclaration et de l'initialisation directes du champ, celui-ci sera initialisé à l'aide du constructeur Java par défaut. Cependant, vous aurez seulement un contexte une fois que la méthode du cycle de vie onCreate aura lieu, ce qui est beaucoup, beaucoup plus tard et fait partie d'Android, pas de Java. Ainsi, lorsque vous appelez le constructeur LinearLayout avec this, Android attend une référence à un contexte, que vous obtenez uniquement après l'appel à onCreate.

+0

Yup! Juste pour développer un peu - quand vous dites 'LinearLayout typeSelector = new LinearLayout (this)', cela s'exécute réellement dans le constructeur de votre 'ListFilteredActivity'. Vous n'avez pas défini un constructeur par défaut (je triche un peu en disant par défaut, ce n'est pas correct à 100%, mais assez bon pour que je puisse faire passer ce point). Le constructeur est appelé. À l'intérieur de ce constructeur par défaut, le code 'new LinearLayout (this) est en cours d'exécution. Probablement "ceci" est un objet Java valide, mais n'a pas encore été "préparé" par le système d'exploitation android. AKA 'this' n'est pas encore un Contexte android valide. Quelle . . . – Hamy

+0

. . . est probablement en train de s'appeler 'this' dans le constructeur LinearLayout. Cette méthode s'attend à avoir de la valeur qu'un Contexte Android valide contiendrait. Cependant, 'this' n'a pas encore été configuré en tant qu'objet de contexte android valide, donc' this' retournera probablement la valeur par défaut pour la valeur demandée. La valeur par défaut est probablement nulle. Puis quelqu'un dans le ctor 'LinearLayout' il essaie de faire un certain appel de méthode sur null, en pensant que c'est une valeur de contexte android valide. D'où 'NullPointerException'. J'espère que cela vous aide à comprendre! – Hamy

Questions connexes