Why getApplicationContext() in constructor of Activity throws null pointer exception?

南楼画角 提交于 2019-11-26 08:37:07

问题


After some time spent bug hunting it turns out that :

public class MainActivity extends BaseActivity { // BaseActivity extends Activity

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

Why ? Where is this documented ?
Froyo


回答1:


Wait for the end of onCreate to call this method.

public class MainActivity extends BaseActivity { 

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



回答2:


Just to get a feeling of what's going on. Activity extends ContextThemeWrapper which extends ContextWrapper from whom Activity inherits getApplicationContext(). ContextWrapper implements it as :

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

The only public constructor of ContextWrapper is :

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

in ContextThemeWrapper we have :

 public  ContextThemeWrapper() {
     super(null);
 }

and since Activity does not define an explicit constructor the constructor above is called - mBase == null in Activity's constructor - boom.

Links from 4.2.2_r1



来源:https://stackoverflow.com/questions/16004891/why-getapplicationcontext-in-constructor-of-activity-throws-null-pointer-excep

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!