Android NewsApp跳转HomeActivity触发FATAL EXCEPTION空指针崩溃
问题定位
崩溃触发原因是空指针异常,和页面跳转逻辑本身无关,是HomeActivity初始化后发起新闻列表请求,接口返回非成功状态时执行了错误的控件操作:
- 错误日志明确指向
HomeActivity.kt:108行,代码尝试对一个null对象调用setText()方法 - 根因是HomeActivity中错误导入了MainActivity布局的控件合成属性,自身布局里不存在
edUserName这个输入框控件,Kotlin合成插件找不到对应控件实例时会返回null,调用方法直接触发崩溃 - 具体错误点:
- HomeActivity导入区多余引入了
import kotlinx.android.synthetic.main.activity_main.* - HomeActivity的
onResponse回调中,接口返回失败分支写了edUserName.setText(""),edUserName是activity_main.xml里的用户名输入框,仅存在于MainActivity页面,HomeActivity加载的是activity_home.xml布局,根本没有这个控件。
- HomeActivity导入区多余引入了
修复方案
按以下步骤修改即可解决崩溃:
- 删除HomeActivity中多余的错误导入语句:
// 移除该行,HomeActivity不需要引用MainActivity布局的控件 import kotlinx.android.synthetic.main.activity_main.* - 修改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.") } } - (可选补全逻辑)你在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
相关产品推荐
相关产品推荐

