Android向Java类传入Context时遇空指针崩溃问题求助
咱们先拆解下你遇到的报错:
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还未就绪。
具体修复步骤
给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); // 你的其他业务逻辑... } }在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); } }额外注意:避免内存泄漏
如果你的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

