安卓应用启动崩溃,问题定位在findViewById初始化TextView代码行
问题根源
你直接在类成员变量声明阶段调用findViewById会导致崩溃——因为Activity的视图布局还未加载。类成员变量的初始化时机早于onCreate方法执行,而setContentView(R.layout.activity_main)才是将布局文件加载到内存的关键步骤,没执行这一步时,findViewById根本找不到对应的View,会返回null,进而触发空指针异常。
修复方案
把View的初始化逻辑移到setContentView之后,以下是两种常用实现方式:
方法1:使用lateinit延迟初始化
声明变量时用lateinit标记,在布局加载完成后的onCreate方法内完成初始化:
class MainActivity : AppCompatActivity() { private var numOne = "" private var numTwo = "" private var operation = "" // 仅声明变量,不立即初始化 private lateinit var operationtexView: TextView private lateinit var buttn0: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 布局加载完成后初始化View operationtexView = findViewById(R.id.operation) buttn0 = findViewById(R.id.buttn0) initListener() } private fun initListener(){ buttn0.setOnClickListener { AddNumberInput( 0.toString() ) } } private fun AddNumberInput(number: String){ if(operation == ""){ numOne += number } else{ numTwo += number } operationtexView.text = StringBuilder().append(operationtexView.text.toString()).append(number) } }
方法2:使用可空类型+安全调用
如果不想用lateinit,可以将变量声明为可空的TextView?,在onCreate内赋值,后续调用时使用安全调用避免空指针:
class MainActivity : AppCompatActivity() { private var numOne = "" private var numTwo = "" private var operation = "" private var operationtexView: TextView? = null private var buttn0: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) operationtexView = findViewById(R.id.operation) buttn0 = findViewById(R.id.buttn0) initListener() } private fun initListener(){ buttn0?.setOnClickListener { AddNumberInput( 0.toString() ) } } private fun AddNumberInput(number: String){ if(operation == ""){ numOne += number } else{ numTwo += number } operationtexView?.text = StringBuilder().append(operationtexView?.text.toString() ?: "").append(number) } }
额外提示
优先推荐方法1的lateinit写法,代码更简洁且无需频繁处理空值。另外要确认布局文件activity_main.xml中确实存在id为operation和buttn0的TextView,否则即使移到onCreate里初始化,仍会因找不到View报错。
内容的提问来源于stack exchange,提问作者den karp
相关产品推荐
相关产品推荐

