MainActivity中SharedPreferences引发空指针异常求助
问题分析与解决方案
核心原因
这个空指针异常的本质是调用equals()的字符串变量为null,即便你初始化了部分字符串,仍可能存在以下漏网场景:
- SharedPreferences中对应key不存在(首次安装、数据被清理),读取返回null
- Intent传递的Extra未赋值或被意外清空
- 初始化逻辑未覆盖所有分支(比如异步操作后变量被重置为null)
具体修复方案
1. 反转equals()调用顺序
把yourString.equals("target")改成"target".equals(yourString),目标字符串是常量不会为null,即便变量为null也只会返回false,不会抛异常:
// 错误写法(可能空指针) if (loginStatus.equals("logged_in")) { // 跳转登录后Fragment } // 正确写法 if ("logged_in".equals(loginStatus)) { // 跳转登录后Fragment }
2. SharedPreferences读取强制加默认值
从SharedPreferences取数据时必须指定默认值,避免返回null:
SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE); // 第二个参数为默认值,确保不会返回null String loginStatus = sp.getString("login_status", "not_logged");
3. Intent Extra空值兜底处理
在checkIntents()中先判断Intent和Extra是否存在,再做处理:
private void checkIntents() { Intent intent = getIntent(); if (intent == null) return; // 方式1:用带默认值的重载方法 String data = intent.getStringExtra("fragment_data", ""); // 方式2:先判断Extra是否存在再读取 if (intent.hasExtra("fragment_data")) { String data = intent.getStringExtra("fragment_data"); if (data != null) { // 执行数据处理逻辑 } } }
4. 关键变量全局非空校验
在checkLog()和checkIntents()入口对核心变量做兜底:
private void checkLog() { SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE); String loginStatus = sp.getString("login_status", "not_logged"); // 双重兜底,避免极端情况 if (loginStatus == null) { loginStatus = "not_logged"; sp.edit().putString("login_status", loginStatus).apply(); } // 后续跳转逻辑 }
5. 异步场景同步处理
如果有异步操作(比如网络请求后更新SharedPreferences),要确保状态更新完成后再调用checkLog(),可以用LiveData或回调同步状态,避免读取到未初始化的null值。
调试辅助
- 在可能出问题的地方添加日志,定位具体null变量:
Log.d("MainActivity", "loginStatus: " + loginStatus); Log.d("MainActivity", "intent data: " + data);
- 用Android Studio的Lint工具扫描代码,它会自动提示潜在的空指针风险。
内容的提问来源于stack exchange,提问作者Rober
相关产品推荐
相关产品推荐

