Почему getApplicationContext() в конструкторе Activity выдает исключение из null-указателя?

После некоторого времени, потраченного на поиски ошибок, получается, что:

public class MainActivity extends BaseActivity { // BaseActivity extends Activity

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

Почему? Где это задокументировано? Froyo

Ответ 1

Дождитесь окончания onCreate, чтобы вызвать этот метод.

public class MainActivity extends BaseActivity { 

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

Ответ 2

Просто чтобы понять, что происходит. Активность расширяет ContextThemeWrapper, который расширяет ContextWrapper, из которого Activity наследует getApplicationContext(). ContextWrapper реализует его как:

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

только публичный конструктор ContextWrapper:

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

in ContextThemeWrapper у нас есть:

 public  ContextThemeWrapper() {
     super(null);
 }

и поскольку Activity не определяет явный конструктор, конструктор выше называется - mBase == null в конструкторе действий - стреле.

Ссылки из 4.2.2_r1