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

Android Studio中Context返回null:SharedPreferences写入报空引用求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:36:31