Android Studio中Context返回null:SharedPreferences写入报空引用求助
兄弟,你的空指针问题根源很明确——MainActivity里的静态Context根本没被初始化就被调用了!咱们一步步来搞定它:
1. 先把MainActivity的Context初始化补全
你只写了getContext()方法,但没给静态Context赋值啊!得在Activity的生命周期里把它填上,而且为了避免内存泄漏,最好用ApplicationContext而非Activity本身的Context:
public class MainActivity extends AppCompatActivity { private static Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 在这里完成静态Context的初始化 context = getApplicationContext(); } public static Context getContext(){ return context; } }
2. 修正SharedPreferences的写入代码
你原来的代码里有个冗余操作:已经调用.edit()拿到Editor了,又重复调用sp.edit(),这完全没必要,而且容易搞混。正确的写法应该是这样:
// 先确保context已经初始化完成(比如在MainActivity onCreate之后调用) Context appContext = MainActivity.getContext(); if (appContext != null) { // 获取SharedPreferences实例 SharedPreferences sp = appContext.getSharedPreferences("currentData", Context.MODE_PRIVATE); // 获取编辑器并写入数据 SharedPreferences.Editor editor = sp.edit(); editor.putString("name", placeName); editor.apply(); }
或者更简洁的链式调用:
Context appContext = MainActivity.getContext(); if (appContext != null) { appContext.getSharedPreferences("currentData", Context.MODE_PRIVATE) .edit() .putString("name", placeName) .apply(); }
3. 更稳妥的优化建议
其实依赖Activity的静态Context不是最佳实践,很容易因为生命周期问题导致空指针或者内存泄漏。更好的方式是在调用工具方法时直接传入Context参数,比如写个工具类:
public class SpUtils { public static void savePlaceName(Context context, String placeName) { // 这里用ApplicationContext更安全 Context appContext = context.getApplicationContext(); appContext.getSharedPreferences("currentData", Context.MODE_PRIVATE) .edit() .putString("name", placeName) .apply(); } }
调用的时候直接从Activity传参:
// 在MainActivity里调用 SpUtils.savePlaceName(this, "北京");
这样既避免了静态Context的坑,代码也更清晰!
内容的提问来源于stack exchange,提问作者JoeBoggs
相关产品推荐
相关产品推荐

