Почему 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