Android应用启动报错java.lang.RuntimeException求助
解决Android应用启动时的NullPointerException问题
问题根源
从报错日志和代码来看,MainActivity.kt第37行的!!非空断言操作符触发了NullPointerException:
userLogin = UserLogin(txtUserLoginIdShare!!,txtUserLoginPassShare!!)
当getSharedPreferences("datos_usuario_login", MODE_PRIVATE)获取的id或pass为null时,!!会直接抛出NPE。昨天应用正常是因为SharedPreferences中存在登录数据,今天数据丢失(比如应用被清除数据、首次安装启动)导致获取到null值。
解决方案
避免使用!!强制非空,改为先判断数据是否有效,再执行登录逻辑,同时处理未保存登录信息的场景:
修改后的代码
private fun validateUserLogin(){ val guardarEnXml = getSharedPreferences("datos_usuario_login", MODE_PRIVATE) val userId = guardarEnXml.getString("id", null) val userPass = guardarEnXml.getString("pass", null) // 检查id和密码是否不为空且非空白字符串 if (!userId.isNullOrBlank() && !userPass.isNullOrBlank()) { userLogin = UserLogin(userId, userPass) userViewModel.loginUser(userLogin) } else { // 跳转到登录页面,让用户重新登录 startActivity(Intent(this, LoginActivity::class.java)) finish() } }
补充说明
- 禁止滥用
!!:Kotlin中的!!是高危操作,仅当你100%确认变量不为null时才使用,否则会直接触发崩溃。SharedPreferences的数据可能因清除缓存、重装应用等场景丢失,必须做空安全判断。 - 业务逻辑灵活调整:如果应用允许用户未登录使用部分功能,可以修改else分支逻辑,比如跳过登录流程而非强制跳转登录页。
- 默认值优化:也可以在
getString时设置默认空字符串替代null(如getString("id", "")),但仍需判断是否为空字符串,避免发起无效登录请求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

