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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:45:02