7

Dopo qualche tempo la caccia bug trascorso si scopre che:Perché getApplicationContext() nel costruttore di Activity genera un'eccezione del puntatore nullo?

public class MainActivity extends BaseActivity { // BaseActivity extends Activity 

    public MainActivity() { 
     super(); 
     getApplicationContext(); // NPE here 
    } 
} 

Perché? Dove è documentato?
Froyo

+3

Mai implementare un costruttore un'attività. – CommonsWare

+0

@CommonsWare: in realtà era in un 'servizio ': D Cura di fornire alcuni collegamenti di input, collegamenti di origine. Ad ogni modo questo non dovrebbe/non è documentato da qualche parte? –

+0

Si sta tentando di ottenere un valore che non è stato ancora istanziato dal framework. Ecco perché hai metodi come 'onCreate()', dove è sicuro usare questi valori. – dmon

risposta

7

Attendere la fine di onCreate per chiamare questo metodo.

public class MainActivity extends BaseActivity { 

    public onCreate(Bundle savedInstanceState) { 
     super(savedInstanceState); 
     getApplicationContext(); //activity has a context now 
    } 
} 
+0

Ho scoperto - il mio problema non è quello 'getApplicationContext();' restituisce null ma che _throws_. Dove è documentata questa è la mia domanda - e forse qualche teoria in materia :) - Credo che molti siano caduti nella mancanza di documenti su questo - si qualificherebbe per un bug report –

+0

Controlla il codice sorgente di Attività. La mia ipotesi è che verrà chiamato un contesto e generare l'NPE. – Snicolas

+0

Cura di pubblicare un collegamento al codice? –

7

Solo per avere un'idea di cosa sta succedendo. Attivitàextends ContextThemeWrapper che si estende ContextWrapper da chi attività eredita getApplicationContext(). ContextWrapperimplements it as:

@Override 
public Context getApplicationContext() { 
    return mBase.getApplicationContext(); // mBase is a Context 
} 

La only public constructor di ContextWrapper è:

public ContextWrapper(Context base) { 
    mBase = base; 
} 

in ContextThemeWrapperwe have:

public ContextThemeWrapper() { 
    super(null); 
} 

e dal attività non definisce un costruttore esplicito l'aria structor above è chiamato - mBase == null nel costruttore di Activity - boom.

Link da 4.2.2_r1