You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android向Java类传入Context时遇空指针崩溃问题求助

解决SharedPreferences空指针崩溃问题

咱们先拆解下你遇到的报错:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference

这个问题的核心很明确——你在TimeModule类里执行Preferences sharedPreferences = new Preferences(this);时,这里的this对应的Context对象是空的,导致调用getSharedPreferences时触发了空指针异常。

为什么会出现这个情况?

大概率是初始化TimeModule的方式有问题:

  • 可能是直接用了无参构造new TimeModule(),导致TimeModule内部的this根本不是一个有效的Context实例;
  • 也可能是在Activity还没完成初始化(比如onCreate执行前)就创建了TimeModule对象,此时Context还未就绪。

具体修复步骤

  1. 给TimeModule添加带Context参数的构造方法
    把TimeModule改成必须传入Context的形式,彻底避免依赖空的this:

    public class TimeModule {
        private Context mContext;
    
        // 强制要求传入有效Context
        public TimeModule(Context context) {
            this.mContext = context;
            // 用传入的有效Context初始化Preferences
            Preferences sharedPreferences = new Preferences(mContext);
            // 你的其他业务逻辑...
        }
    }
    
  2. 在Template1Activity中正确初始化TimeModule
    要在Activity的生命周期方法(比如onCreate)里,用当前Activity的实例作为Context传入:

    public class Template1Activity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_template1);
    
            // 用this(当前Activity的有效Context)创建TimeModule实例
            TimeModule timeModule = new TimeModule(this);
        }
    }
    
  3. 额外注意:避免内存泄漏
    如果你的TimeModule是长期存活的对象(比如单例),不要直接持有Activity的Context,改用Application级别的Context:

    // 在Activity中传入Application Context
    TimeModule timeModule = new TimeModule(getApplicationContext());
    

验证Preferences类的正确性

顺便确认下你的Preferences类构造是正确接收Context的,比如应该是这样的:

public class Preferences {
    private SharedPreferences mSharedPrefs;

    public Preferences(Context context) {
        // 用传入的Context获取SharedPreferences
        mSharedPrefs = context.getSharedPreferences("your_preference_name", Context.MODE_PRIVATE);
    }
}

按照这个方法修改后,应该就能解决打开Template1Activity时的崩溃问题了。

内容的提问来源于stack exchange,提问作者Luke C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:59:03