为何Context非空时调用getApplicationContext()仍出现NullPointerException?
排查Context.getApplicationContext()空指针问题
你遇到的这个NPE,不是传入的context参数本身为空,而是你拿到的Context实例属于ContextWrapper(比如Activity、Service都是它的子类),但这个ContextWrapper内部持有的底层mBase Context对象已经是null了。当调用getApplicationContext()时,ContextWrapper会尝试调用mBase.getApplicationContext(),这时候就触发了空指针。
接下来可以从这几个方向排查:
- 检查传入Context的生命周期:比如是不是传入了已经被销毁的Activity?Activity执行
onDestroy后,内部的mBase可能会被系统置空,但Activity实例本身可能还没被GC回收,所以你的context != null判断能通过,但调用applicationContext就会报错。 - 确认Context的类型:如果是自定义的ContextWrapper子类,检查初始化时有没有正确调用
super(base)来设置底层的mBase对象,漏了这一步会导致后续调用方法时出现这个问题。 - 优先使用全局ApplicationContext:Room数据库初始化应该依赖全局的ApplicationContext,它不会随Activity/Fragment的销毁而失效。可以直接在方法里转成ApplicationContext,代替直接使用传入的context:
fun getDatabase(context: Context, scope: CoroutineScope): MyRoomDatabase { val appContext = context.applicationContext ?: throw IllegalStateException("无法获取全局ApplicationContext") // 后续用appContext初始化数据库 } - 排查引用方式:如果是用WeakReference持有Context,可能WeakReference已经被回收,虽然拿到的Context实例非空,但内部状态已经失效,这时候也会出现这种情况。
内容的提问来源于stack exchange,提问作者Ollyver
相关产品推荐
相关产品推荐

