为什么在Activity的构造函数中getApplicationContext()会抛出空指针异常?

Mr_*_*s_D 8 android constructor nullpointerexception android-context

经过一段时间的寻找虫子后,事实证明:

public class MainActivity extends BaseActivity { // BaseActivity extends Activity

    public MainActivity() {
        super();
        getApplicationContext(); // NPE here
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么?这记录在哪里?
升级Froyo

Sni*_*las 9

等待结束onCreate调用此方法.

public class MainActivity extends BaseActivity { 

    public onCreate(Bundle savedInstanceState) {
        super(savedInstanceState);
        getApplicationContext(); //activity has a context now
    }
}
Run Code Online (Sandbox Code Playgroud)


Mr_*_*s_D 8

只是为了了解发生了什么.Activity 扩展了ContextThemeWrapper,它扩展了Activity继承的ContextWrapper.ContextWrapper将其实现为:getApplicationContext()

@Override
public Context  getApplicationContext() {
    return mBase.getApplicationContext(); // mBase is a Context
}
Run Code Online (Sandbox Code Playgroud)

唯一的公共构造函数ContextWrapper方法是:

 public  ContextWrapper(Context base) {
     mBase = base;
 } 
Run Code Online (Sandbox Code Playgroud)

ContextThemeWrapper 我们有:

 public  ContextThemeWrapper() {
     super(null);
 }
Run Code Online (Sandbox Code Playgroud)

并且由于Activity没有定义显式构造函数,因此上面的构造函数被调用 - mBase == null在Activity的构造函数中 - 繁荣.

来自的链接 4.2.2_r1