7

Nach einiger Jagdzeit verbrachte Fehler es stellt sich heraus, dass:Warum ruft getApplicationContext() im Konstruktor von Activity eine Nullzeigerausnahme ab?

public class MainActivity extends BaseActivity { // BaseActivity extends Activity 

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

Warum? Wo ist das dokumentiert?
Froyo

+3

nie einen Konstruktor auf eine Tätigkeit implementieren. – CommonsWare

+0

@CommonsWare: Es war tatsächlich auf einem 'Service': D Sorge dafür, einige Input - Links - Source Links zur Verfügung zu stellen. Wie auch immer, sollte dies nicht irgendwo dokumentiert sein? –

+0

Sie versuchen, einen Wert zu erhalten, der noch nicht vom Framework instanziiert wurde. Deshalb haben Sie Methoden wie 'onCreate()', wo diese Werte sicher verwendet werden können. – dmon

Antwort

7

Warten Sie auf das Ende von onCreate, um diese Methode aufzurufen.

public class MainActivity extends BaseActivity { 

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

Ich fand heraus - mein Problem ist nicht das 'getApplicationContext();' gibt null zurück, aber es _throws_. Wo ist dies dokumentiert ist meine Frage - und möglicherweise eine Theorie in der Sache :) - Ich glaube, viele sind auf den Mangel an Dokumenten auf diesem Fall gefallen - würde sich für einen Fehlerbericht –

+0

Check am Quellcode der Aktivität. Meine Vermutung ist, dass ein Kontext aufgerufen wird und die NPE erzeugt. – Snicolas

+0

Möchten Sie einen Link zum Code posten? –

7

Nur um ein Gefühl von dem zu bekommen, was vor sich geht. Aktivitätextends ContextThemeWrapper die erweitert ContextWrapper von dem Aktivität erbt getApplicationContext(). ContextWrapperimplements it as:

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

Die only public constructor von ContextWrapper ist:

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

in ContextThemeWrapperwe have:

public ContextThemeWrapper() { 
    super(null); 
} 

und seit Aktivität keinen expliziten Konstruktor die con definieren Structor oben heißt - mBase == null im Activity-Konstruktor - Boom.

Links von 4.2.2_r1