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

Android NewsApp跳转HomeActivity触发FATAL EXCEPTION空指针崩溃

问题定位

崩溃触发原因是空指针异常,和页面跳转逻辑本身无关,是HomeActivity初始化后发起新闻列表请求,接口返回非成功状态时执行了错误的控件操作:

  • 错误日志明确指向HomeActivity.kt:108行,代码尝试对一个null对象调用setText()方法
  • 根因是HomeActivity中错误导入了MainActivity布局的控件合成属性,自身布局里不存在edUserName这个输入框控件,Kotlin合成插件找不到对应控件实例时会返回null,调用方法直接触发崩溃
  • 具体错误点:
    1. HomeActivity导入区多余引入了import kotlinx.android.synthetic.main.activity_main.*
    2. HomeActivity的onResponse回调中,接口返回失败分支写了edUserName.setText(""),edUserName是activity_main.xml里的用户名输入框,仅存在于MainActivity页面,HomeActivity加载的是activity_home.xml布局,根本没有这个控件。
修复方案

按以下步骤修改即可解决崩溃:

  1. 删除HomeActivity中多余的错误导入语句:
    // 移除该行,HomeActivity不需要引用MainActivity布局的控件
    import kotlinx.android.synthetic.main.activity_main.*
    
  2. 修改HomeActivity的onResponse方法,删除错误的控件调用:
    override fun onResponse(call: Call<Response>, response: retrofit2.Response<Response>) {
        if(progressDialog.isShowing)
            progressDialog.dismiss()
    
        if(response.body()!=null){
            val serverResponse = response.body()
            if(serverResponse!!.status){
                DataProvider.response = serverResponse
            }else{
                showToast(serverResponse.message)
                // 删除此处的edUserName.setText("")代码,HomeActivity无该控件
            }
        }
        else{
            showToast("Server is not responding. Please try again later.")
        }
    }
    
  3. (可选补全逻辑)你在HomeActivity中给btnExit绑定了点击监听,但没有在onClick方法中写对应处理逻辑,建议补全:
    override fun onClick(v: View?) {
        when(v?.id){
            R.id.btnAllNews -> {
                if(DataProvider.response.allNews.size>0){
                    Intent(this,ViewAllNewsActivity::class.java).apply {
                        startActivity(this)
                    }
                }else{
                    showToast("Blogs are not available")
                }
            }
            R.id.btnMyNews -> {
    
            }
            R.id.btnSignOut -> {
                signOut()
            }
            // 新增退出按钮逻辑
            R.id.btnExit -> {
                finish()
            }
        }
    }
    
开发建议
  • 你当前使用的kotlinx.android.synthetic控件引用方案已被Google官方废弃,后续开发建议替换为ViewBinding,这类跨布局引用控件的错误会在编译阶段直接提示,不会等到运行时才触发崩溃。
  • 从Intent获取传递参数时,不要直接链式调用toString(),如果参数传递异常会触发空指针,建议加空值兜底:
    userId = intent.getStringExtra(Constant.KEY_USER_ID) ?: ""
    userName = intent.getStringExtra(Constant.KEY_USER_NAME) ?: ""
    

内容的提问来源于stack exchange,提问作者Mr Fin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:30:54